【问题标题】:HttpURLConnection POST request - cannot send data to serverHttpURLConnection POST 请求 - 无法将数据发送到服务器
【发布时间】:2015-04-05 05:48:44
【问题描述】:

我有这个代码:

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

output 为真(执行 POST 或 PUT 请求)且未完成请求时,此代码会引发 IOException。我尝试对conn.connect()、写调用和流创建块进行重新排序,但没有进行任何排列。

在所有情况下,BufferedReader 都可以正常工作并且不会引发任何异常。 getQuery 正确返回一个 URL 编码的字符串。

这是来自 IOException 的堆栈跟踪:

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 数据最终到达服务器 - 就像写入调用从未发生过一样。

有谁知道是什么原因造成的,或者如何解决?

【问题讨论】:

    标签: java android httpurlconnection


    【解决方案1】:

    你把代码弄复杂了。 这是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();
            }
    

    【讨论】:

      猜你喜欢
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 2013-07-29
      • 1970-01-01
      • 2012-04-03
      相关资源
      最近更新 更多