【发布时间】:2013-03-15 13:35:32
【问题描述】:
我正在尝试使用HttpURLConnection 连接服务器,但我的 PUT 方法有问题。
我需要发送 1500 个字符(或更多)的字符串,但在这种情况下,服务器会产生超时并返回 500 - 服务器内部错误。
如果我发送的字符串小于1400 个字符,我没有问题,服务器返回OK。
我的代码如下:
public String connectToServer(String prototype) {
String responseString = "";
try {
BufferedReader in = new BufferedReader(new InputStreamReader(openURLForInput(new URL(URL), USERNAME, PASSWORD, prototype)));
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
responseString += line;
}
} catch (IOException e) {
e.printStackTrace();
responseString = e.toString();
}
return responseString;
}
//-----------
public InputStream openURLForInput(URL url, String uname, String pword, String content) throws IOException {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Authorization", userNamePasswordBase64(uname, pword)); // I know this is OK
conn.addRequestProperty("Content-type", "application/xml; charset=utf-8");
//conn.setChunkedStreamingMode(8 * 1024);
conn.setRequestMethod("PUT");
conn.connect();
OutputStream output = conn.getOutputStream();
OutputStreamWriter osw = new OutputStreamWriter(output, "UTF-8");
BufferedWriter writer = new BufferedWriter(osw);
writer.write(content); // content length > 1400 characters
writer.close();
output.close();
int status = conn.getResponseCode();
Log.i("STATUS", status + "");
Log.i("STATUS_ERROR", conn.getResponseMessage());
return conn.getInputStream();
}
我尝试添加线条
conn.setFixedLengthStreamingMode(contentLength)
conn.setChunkedStreamingMode(8 * 1024);
但无论如何服务器的回答是错误的。
更新:
我可以检测到问题。出于某种原因,当我尝试在请求中发送大型正文时,服务器会产生超时但并非针对所有网络,仅针对某些网络。我使用的是安全连接 SSL,也许这会带来问题?
【问题讨论】:
-
你连接的是什么类型的服务器;你有管理员权限吗?还是管理员在你旁边的桌子上是个友好的人?
-
尝试添加这个:conn.addRequestProperty("Content-Length", content.getLength());
-
Class Stacker:我们可以,但是我们应该问什么?那部分我不知道。 @Kylar:我们已经尝试过这种方式,但仍然将消息减少到 1415 个字符。奇怪的是我们在发送 1416 时得到了 TimeOut,而不是缺少 1 个字符的消息(这清楚吗?)
-
你能得到一个线级跟踪吗(使用wireshark、tcpflow或其他东西?)
-
我们需要更多信息来帮助您。你能回答以下问题吗? A -> 这是什么服务器? (tomcat / JBoss) B -> 发布 HTTP 500 的堆栈跟踪。它应该在应用程序日志或服务器日志中可用。 C -> 500 是代码还是容器抛出的? D -> 发布导致 500 的 HTTP 请求和响应。 E -> 发布处理请求的服务器端代码。
标签: java android httpurlconnection