Java小程序411内容长度
我是Java新手。我编写了一个带有gui的小程序,将结果(intw和intp)发送到服务器,得到了“411所需长度”错误。我做错了什么?如何设置内容长度 这是与服务器通信的方法:Java小程序411内容长度,java,applet,japplet,content-length,http-content-length,Java,Applet,Japplet,Content Length,Http Content Length,我是Java新手。我编写了一个带有gui的小程序,将结果(intw和intp)发送到服务器,得到了“411所需长度”错误。我做错了什么?如何设置内容长度 这是与服务器通信的方法: public void sendPoints1(int w, int p){ try { String url = "http://somename.com:309/api/Results"; String charset = "UTF-8"; String q
public void sendPoints1(int w, int p){
try {
String url = "http://somename.com:309/api/Results";
String charset = "UTF-8";
String query = String.format("?key=%s&value=%s",
URLEncoder.encode(String.valueOf(w), charset),
URLEncoder.encode(String.valueOf(p), charset));
String length = String.valueOf((url + query).getBytes("UTF-8").length);
HttpURLConnection connection = (HttpURLConnection) new URL(url + query).openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Length", length);
connection.connect();
System.out.println("Responce Code: " + connection.getResponseCode());
System.out.println("Responce Message: " + connection.getResponseMessage());
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
我不是100%确定你为什么会收到411错误代码,但这可能与你没有在帖子中发送任何内容有关。content length标头应该是请求主体的长度(以字节为单位)。您正在将其设置为url的长度 将请求更改为GET,或者将查询放入请求体而不是url本身。如果执行后一种操作,请将内容长度设置为仅正文的长度
public void sendPoints1(int w, int p){
try {
String url = "http://somename.com:309/api/Results";
String charset = "UTF-8";
String query = String.format("key=%s&value=%s",
URLEncoder.encode(String.valueOf(w), charset),
URLEncoder.encode(String.valueOf(p), charset));
byte[] queryBytes = query.getBytes("UTF-8");
String length = String.valueOf((url + query).getBytes("UTF-8").length);
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Length", length);
OutputStream os = connection.getOutputStream();
os.write(queryBytes);
os.flush();
connection.connect();
System.out.println("Responce Code: " + connection.getResponseCode());
System.out.println("Responce Message: " + connection.getResponseMessage());
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
请求uri包含查询,可以使用GET方法
connection.setRequestMethod("POST"); // modify to GET
connection.setRequestProperty("Content-Length", length); //remove the line
如果使用POST方法,包括“内容长度”标题,则必须发送数据
例如:
public void sendPoints1(int w, int p){
try {
String url = "http://somename.com:309/api/Results";
//value type is int ,don't need URLEncoder.
byte[] data = ("key="+w+"&value="+p).getBytes("UTF-8");
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Length", data.length);
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //URLencode...
OuptputStream out = connection.getOutputStream();
out.write(data);
out.flush();
InputStream in = connnection.getInputStream();
//read .....
System.out.println("Responce Code: " + connection.getResponseCode());
System.out.println("Responce Message: " + connection.getResponseMessage());
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
由于所有信息都是作为URL的一部分的查询字符串传递的,因此您需要notsetRequestMethod作为POST。但是,如果您仍然希望将其设置为POST作为逻辑的一部分,那么setRequestProperty(“Content Length”,“0”)因为Http服务器希望在调用POST方法时读取长度。在您的情况下,没有任何内容作为POST信息写入,因此最好将其设置为零,即使默认值为零,有时服务器可能会将响应错误代码设置为411,响应消息:Required Length我不知道它是否与411相关,但您将该方法指定为POST,尽管通过GET发送数据(直接在url本身中)。411可能是指定了一个与0字节的实际帖子内容长度不同的帖子内容长度的结果。非常感谢!这段代码经过一些更改后工作起来就像做梦一样。需要此修复的任何人都记得将“?key=“+w+”&value=“+p”添加到url并添加一个连接。setDoOutput(true)再次谢谢你!