使用HttpURLConnection进行JSON数据的PUT请求不起作用

12

我试图在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();
        }
    }

这是我实际要发出的请求:

来自Chrome开发者工具的截图

我已经对同一应用程序中的资源进行了GET请求,并且它运行良好。如果您能提供调试提示或其他尝试方法,我将非常感激。到目前为止,我只尝试过使用 OutputStream 而不是 OutputStreamWriter,但它也不起作用。


我使用PUT是因为我正在修改小部件中的一些数据。更具体地说,我想要改变小部件在表面上的位置。当我手动执行此操作(使用Web界面)时,应用程序会像我附上的屏幕截图中所示使用PUT。我尝试将其更改为POST,但它不起作用。 - Booyaches
2
@Hanno - 使用@PUT是一种符合RESTful规范的更新资源的约定,并不仅限于传输文件。请参考RFC - http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.6 - NBW
1个回答

33

除非你告诉Sun (Oracle)实现的HttpURLConnection进入流模式,否则它会缓存你的post内容。如果你开始与响应进行交互,如下所示,则会发送内容:

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

@Booyaches,我认为你的问题在于发送有效载荷。根据RFC 4627的信息更新,它不接受单引号。 - Roger Lindsjö
更新了示例代码,该代码(查看您在url中使用的表面)将大绿色音符移动到随机位置。 - Roger Lindsjö
我注意到没有connection.setConnectTimeout() - 对于PUT请求来说不是必需的吗? - Someone Somewhere

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接