Java小程序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

我是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 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)再次谢谢你!