web-dev-qa-db-ja.com

HttpURLConnectionを使用してJSONデータを含むPUTリクエストを作成できない

JavaでHttpURLConnectionを使用してJSONデータでPUTリクエストを作成しようとしています。私のやり方ではうまくいきません。エラーが出ないので、何が問題なのかわかりません。

public static void main(String[] args) {

        URL url;
        try {
            url = new URL("http://fltspc.itu.dk/widget/515318fe17450f312b00153d/");
            HttpURLConnection hurl = (HttpURLConnection) url.openConnection();
            hurl.setRequestMethod("PUT");
            hurl.setDoOutput(true);
            hurl.setRequestProperty("Content-Type", "application/json");
            hurl.setRequestProperty("Accept", "application/json");

            String payload = "{'pos':{'left':45,'top':45}}";

            OutputStreamWriter osw = new OutputStreamWriter(hurl.getOutputStream());
            osw.write(payload);
            osw.flush();
            osw.close();
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

そして、これが私が実際にしようとしている要求です:

Screenshot from Chrome Developer Tools

同じアプリ内のリソースに対してすでにGETリクエストを作成しており、問題なく動作しました。どうすればデバッグできるのか、他の方法でどうやってそれを試すことができるのかについてのすべてのヒントにとても感謝しています。これまでのところ、OutputStreamではなくOutputStreamWriterのみを使用してみましたが、どちらも機能しません。

10
Booyaches

HttpURLConnectionのSun(Oracle)実装は、ストリーミングモードであると指示しない限り、投稿のコンテンツをキャッシュします。次のような応答との対話を開始すると、コンテンツが送信されます。

hurl.getResponseCode();

また、RFC 4627によると、jsonで一重引用符を使用することはできません(ただし、実装によっては気にしないようです)。

したがって、ペイロードを次のように変更します。

String payload = "{\"pos\":{\"left\":45,\"top\":45}}";

この例は私のために働きます

public class HttpPut {
    public static void main(String[] args) throws Exception {
        Random random = new Random();
        URL url = new URL("http://fltspc.itu.dk/widget/515318fe17450f312b00153d/");
        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        connection.setRequestMethod("PUT");
        connection.setDoOutput(true);
        connection.setRequestProperty("Content-Type", "application/json");
        connection.setRequestProperty("Accept", "application/json");
        OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream());
        osw.write(String.format("{\"pos\":{\"left\":%1$d,\"top\":%2$d}}", random.nextInt(30), random.nextInt(20)));
        osw.flush();
        osw.close();
        System.err.println(connection.getResponseCode());
    }
}
26
Roger Lindsjö