HttpURLConnection方法总是GET吗?

3
根据Android文档,我已经设置了setDoOutPut(true);以便连接作为POST发送。然而,在调试程序时,当我检查HTTPURLConnection方法成员时,它总是GET,即使在设置了setDoOutput(true)setRequestMethod("POST")之后。我是否不小心将其重置为GET
URL url = new URL(serverAddr);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setDoOutput(true);
urlConnection.setRequestMethod(verb);
urlConnection.setFixedLengthStreamingMode(postBody.getBytes().length);
//urlConnection.setRequestProperty("Content-Length", postBody.getBytes().toString());
urlConnection.setRequestProperty("Content-Type", "application/json;charset=utf-8");

urlConnection.connect();

OutputStream out = new BufferedOutputStream(urlConnection.getOutputStream());
out.write(postBody.getBytes());
out.flush();

int responseCode = urlConnection.getResponseCode();
System.out.println("HTTPS RESPONSE CODE: " + responseCode);

out.close();

编辑:这一定是一个 Bug……调试器清楚地显示 setDoOutput 成员变量为 false,即使我将其设置为 true。它没有被设置!


什么是“动词”?你确认它确实发出了GET请求而不是POST请求吗? - dylan7
动词“POST”被传入,我该如何验证呢?响应代码返回400,但我不确定是错误的GET请求还是错误的POST请求。 - ShrimpCrackers
请尝试以下代码:URL url = new URL(address); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setDoOutput(true); urlConnection.setRequestProperty("Content-Type", ...); OutputStream outputStream = new BufferedOutputStream(urlConnection.getOutputStream()); BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8")); writer.write(requestBody); writer.flush(); writer.close(); outputStream.close(); - BNK
对我来说,在JDK1.8上有问题,但在JDK11上完美运行。 - undefined
大家好,这是我多年前的帖子。如果你正在阅读这篇文章,请使用Retrofit!除非必须,不要使用原生的http! - undefined
2个回答

0

1
不起作用。文档上说:“要将数据上传到Web服务器,请使用setDoOutput(true)配置输出连接。” - ShrimpCrackers
根据文档,它默认设置为true。 - Sudip Bhandari
1
我认为他的意思是urlConnection.setDoOutput(true)。输入流实际上是用于从服务器接收数据,而输出流用于向服务器发送数据。 - ofekp

0

这是我的工作示例:

    url = new URL(requestURL);

    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setReadTimeout(15000);
    conn.setConnectTimeout(15000);
    conn.setRequestMethod("POST");
    conn.setDoInput(true);
    conn.setDoOutput(true);


    OutputStream os = conn.getOutputStream();
    BufferedWriter writer = new BufferedWriter(
            new OutputStreamWriter(os, "UTF-8"));
    writer.write(getPostDataString(postDataParams));

    writer.flush();
    writer.close();
    os.close();
    int responseCode=conn.getResponseCode();
    Map<String, List<String>> mp = conn.getHeaderFields();

    if (responseCode == HttpsURLConnection.HTTP_OK) {
        String line;
        BufferedReader br=new BufferedReader(new InputStreamReader(conn.getInputStream()));
        while ((line=br.readLine()) != null) {
            response+=line;
        }
    }

我遇到了一个非常奇怪的问题。我使用调试器来逐步执行setDoOutput(true)。我可以看到成员变量被设置为true,但是一旦程序跳出该方法,doOutput仍然为false!这里发生了什么? - ShrimpCrackers
非常奇怪。你能尝试一下我的代码片段中conn调用的顺序吗?先设置请求方法,然后设置输入和输出。 - Selçuk Cihan
刚试了一下,还是一样的问题。doOutput 总是为 false。即使使用 setRequestMethod("POST"),方法仍然是 "GET"。 - ShrimpCrackers
有什么进展吗?我在Marshmallow上遇到了同样的问题。 - Ábrahám Endre
@ÁbrahámEndre 你能解决这个问题吗?我还卡在这里。总是发送GET请求。 - ShrimpCrackers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接