当前位置: 首页 > 知识库问答 >
问题:

HttpURLConnection POST请求-无法向服务器发送数据

姚善
2023-03-14

我有这个代码:

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000);
conn.setConnectTimeout(10000);
conn.setRequestMethod(type);
conn.setDoOutput(output);
if(output)
   conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setDoInput(true);

conn.connect();

OutputStream out = null;
if(output)
   out = conn.getOutputStream();
InputStream in = conn.getInputStream();

if(output) {
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out, "UTF-8"));
    bw.write(getQuery(params));
    bw.flush();
}

// Get output
BufferedReader br = new BufferedReader(new InputStreamReader(in));
StringBuilder sb = new StringBuilder();
String line;
while((line = br.readLine()) != null) {
    sb.append(line);
    sb.append("\n");
}

in.close();
if(output)
    out.close();

// Do stuff with the output

输出为 true(执行 POST 或 PUT 请求)时,此代码会引发 IOException,并且不会完成请求。我尝试对 conn.connect() 重新排序、编写调用和流创建块,但没有排列工作。

在所有情况下,BufferedReader都工作得很好,不会抛出任何异常。< code>getQuery正确返回URL编码的字符串。

以下是来自IOExc的堆栈跟踪:

java.io.IOException: closed
W/System.err﹕ at com.android.okio.RealBufferedSink$1.write(RealBufferedSink.java:129)
W/System.err﹕ at java.io.OutputStreamWriter.flushBytes(OutputStreamWriter.java:167)
W/System.err﹕ at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:158)
W/System.err﹕ at java.io.BufferedWriter.flush(BufferedWriter.java:124)
W/System.err﹕ at org.project.NetworkHelper.doRequest(NetworkHelper.java:57)
W/System.err﹕ at java.lang.Thread.run(Thread.java:818)

最终发生的是请求通过,但没有一个POST或PUT数据最终到达服务器——就像写调用从未发生过一样。

有人知道是什么原因导致的吗,或者如何解决?

共有1个答案

燕砚文
2023-03-14

你把代码弄复杂了。下面是< code>openConnection()实现的一个示例。

        byte[] postData = urlParameters.getBytes(Charset.forName("UTF-8"));
        int postDataLength = postData.length;
        JSONArray jsonArray = null;
        try {
            URL url = new URL(request);
            HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            httpURLConnection.setInstanceFollowRedirects(false);
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setRequestProperty("Content-Type",
                    "application/x-www-form-urlencoded");
            httpURLConnection.setRequestProperty("charset", "utf-8");
            httpURLConnection.setRequestProperty("Content-Length",
                    Integer.toString(postDataLength));
            httpURLConnection.setConnectTimeout(10000);
            DataOutputStream dataOutputStream = new DataOutputStream(
                    httpURLConnection.getOutputStream());
            dataOutputStream.write(postData);
            dataOutputStream.flush();
            dataOutputStream.close();
            if (httpURLConnection.getResponseCode() == HttpURLConnection.HTTP_OK) {
                InputStream responseStream = new BufferedInputStream(
                        httpURLConnection.getInputStream());
                BufferedReader responseStreamReader = new BufferedReader(
                        new InputStreamReader(responseStream));
                //get output
            }
        } catch (Exception e) {
            Customs.mToast(context, "Server down! Try after some time");
            e.printStackTrace();
        }
 类似资料:
  • XMLHttpRequest 对象用于和服务器交换数据。 向服务器发送请求 如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:xmlhttp.open("GET","ajax_info.txt",true); xmlhttp.send(); 方法 描述 open(method,url,async) 规定请求的类型、URL 以及是否异步处理

  • 好的,我对网络服务完全陌生,对于我正在做的一个项目,我试图了解整个SOAP。我想我对正在发生的事情有一个模糊的理解,但是我缺少一些具体的信息,我在谷歌上找不到任何有用的东西。 我已经阅读了其他人提出的问题,例如使用java向Web服务发出的SOAP请求,但我仍然无法完全弄清楚发生了什么。 具体来说,我尝试使用这里提供的服务http://ec.europa.eu/taxation_customs/v

  • 本文向大家介绍Android使用httpPost向服务器发送请求的方法,包括了Android使用httpPost向服务器发送请求的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android使用httpPost向服务器发送请求的方法。分享给大家供大家参考,具体如下: 可以直接用的完整类。 希望本文所述对大家Android程序设计有所帮助。

  • 请求将被发送1个请求/秒,还是所有请求将被一次发送到服务器?

  • 我最近一直在用Java编写自己的Webserver,因为我觉得有一个很不错,昨天我偶然发现了一个问题,我仍然没有解决。我的浏览器(取消搜索Chromium)似乎向服务器发送了一些空请求或类似的东西。我实现了一个请求处理程序,它应该读取GET请求并提取请求的资源。它的工作原理是这样的:它以请求为例:“GET/index.htmlHTTP/1.1”并将其放入带有String.split (" ");