3

私はJavaを初めて使用します。結果(intwおよびintp)をサーバーに送信するGUIを使用してアプレットを作成しましたが、「411LengthRequired」エラーが発生します。私は何が間違っているのですか?Content-Lengthをどのように設定しますか?

これは、サーバーと通信する方法です。

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());
    }

}
4

3 に答える 3

1

なぜ411エラーコードが表示されるのか100%わかりませんが、POSTでコンテンツを送信していないという事実に関係している可能性があります。content-lengthヘッダーは、リクエストの本文のバイト単位の長さである必要があります。URLの長さに設定しています!

リクエストをGETに変更するか、クエリをURL自体ではなくリクエストの本文に配置します。後者を行う場合は、content-lengthを本文の長さのみに設定してください。

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());
    }

}
于 2012-12-14T04:54:46.410 に答える
0

リクエストURIにはクエリが含まれ、GETメソッドを使用できます。

connection.setRequestMethod("POST"); // modify to GET
connection.setRequestProperty("Content-Length", length); //remove the line

POSTメソッドを使用する場合は、「content-length」ヘッドを含め、データを送信する必要があります。

例えば:

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());
    }

}
于 2012-12-14T04:59:47.857 に答える
0

すべての情報はURLの一部であるクエリ文字列として渡されるため、 POSTとしてSetRequestMethodを設定する必要はありません 。ただし、ロジックの一部としてPOSTに設定する場合は、 HttpサーバーとしてsetRequestProperty( "Content-Length"、 "0")は、POSTメソッドが呼び出されたときにLengthが読み取られることを期待します。あなたの場合、POST情報として何も書き込まれないので、ゼロに設定することをお勧めします。デフォルト値がゼロであっても、サーバーが応答errorCodeを411、応答メッセージ:必要な長さとして返す場合があります。

于 2016-03-23T15:04:51.783 に答える