我正在尝试通过网址登录,我在httpurlconnevtion
中获取状态代码500public static String excutePost(String targetURL, String urlParameters)
{
URL url;
HttpURLConnection connection = null;
try {
//Create connection
url = new URL(targetURL);
connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setRequestProperty("Content-Length", "" +
Integer.toString(urlParameters.getBytes().length));
connection.setRequestProperty("Content-Language", "en-US");
connection.setRequestProperty("Accept-Encoding", "");
connection.setUseCaches (false);
connection.setDoInput(true);
connection.setDoOutput(true);
//Send request
DataOutputStream wr = new DataOutputStream (
connection.getOutputStream ());
wr.writeBytes (urlParameters);
wr.flush ();
wr.close ();
System.out.println("status :"+connection.getResponseCode());
System.out.println("getErrorStream() :"+connection.getErrorStream());
//Get Response
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
StringBuffer response = new StringBuffer();
while((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
return response.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if(connection != null) {
connection.disconnect();
}
}
}
和我的参数
String urlParameters =
"pwd1=" + URLEncoder.encode("DEMO123", "UTF-8") +
"&badge=" + URLEncoder.encode("1233", "UTF-8");
我正在获取logcat
status :500
getErrorStream() :libcore.net.http.FixedLengthInputStream@417bc5c0
谢谢
**EDITED 2**
我也试过
DataOutputStream dos = new DataOutputStream(connection.getOutputStream());
// Add badge
dos.writeBytes(LINE_START + BOUNDRY + LINE_END);
dos.writeBytes("Content-Disposition: form-data; name='badge';");
dos.writeBytes(LINE_END + LINE_END);
dos.writeBytes("1233");
dos.writeBytes(LINE_END);
// Add password
dos.writeBytes(LINE_START + BOUNDRY + LINE_END);
dos.writeBytes("Content-Disposition: form-data; name='pwd1';");
dos.writeBytes(LINE_END + LINE_END);
dos.writeBytes("DEMO123");
dos.writeBytes(LINE_END);
答案 0 :(得分:1)
500
表示Internal Server Error
。您可能没有错误,它在服务器上。即使您发送的内容不正确并且导致服务器返回500,它仍然是服务器问题。
修改:
哦,服务器应该返回类似400 Bad Request
而不是500 Internal Server Error
的内容,但我现在发现了您的错误:
connection.setRequestProperty("Content-Length", Integer.toString(urlParameters.getBytes().length));
...
//Send request
DataOutputStream wr = new DataOutputStream (connection.getOutputStream ());
wr.writeBytes (urlParameters);
这里的问题是你首先使用urlParameters
从getBytes
获取字节(引用javadoc):
使用平台的默认字符集
将此String编码为字节序列
然后使用DataOutputStream.writeBytes
编写字节(引用javadoc):
字符串中的每个字符按顺序写出,丢弃其高8位。
总之,您的Content-Length
与数据不匹配。所以服务器返回
java.io.IOException:超出内容长度限制20个字节
解决方案:
//consider urlParameters.getBytes("UTF-8") method instead of using default encoding
byte[] bodyData = urlParameters.getBytes();
connection.setRequestProperty("Content-Length", Integer.toString(bodyData.length));
...
//Send request
InputStream out = connection.getOutputStream();
out.write(bodyData);
编辑2:
编辑1绝对有效,但是,再次查看问题,我相信错误肯定是由服务器引起的。我认为服务器返回一个错误的Content-Length
标头,当在Android上读取数据时,系统意识到来自服务器的数据比Content-Length
更多,并引发异常,也将状态代码替换为500,因为它确实是服务器错误。
编辑3:
connection.setRequestProperty("Content-Language", "en-US");
connection.setRequestProperty("Accept-Encoding", "");
您应该将Content-Language
设置为Content-Encoding
而不是空UTF-8
,而不是设置Accept-Encoding
,而不是空{{1}},您应该添加真正预期的MIME类型。我认为这是服务器错误,但如果正确设置请求标头,则可能不会出现。
答案 1 :(得分:0)
状态代码500
表示Internal Server Error
。为什么会抛出这个,只有targetURL
后面的服务器知道。
确认您正确使用了API。看一下响应的正文(除了状态代码)可能会提供一个提示。