Http请求POST与GET

时间:2010-03-26 17:57:19

标签: java http post get request

我在使用OAuth编写的应用程序中使用了大量HTTP请求。目前,我以同样的方式发送我的GET和POST请求:

HttpConnection connection = (HttpConnection) Connector.open(url
                    + connectionParameters);

            connection.setRequestMethod(method);
            connection.setRequestProperty("WWW-Authenticate",
                    "OAuth realm=api.netflix.com");

            int responseCode = connection.getResponseCode();

这很好用。我成功地发帖和获取。但是,我担心我没有以正确的方式进行POST。我是否需要在上面的代码中包含以下if语句?

if (method.equals("POST") && postData != null) {
                    connection.setRequestProperty("Content-type",
                            "application/x-www-form-urlencoded");
                    connection.setRequestProperty("Content-Length", Integer
                            .toString(postData.length));
                    OutputStream requestOutput = connection.openOutputStream();
                    requestOutput.write(postData);
                    requestOutput.close();
                }

如果是这样,为什么?有什么不同?我将不胜感激任何反馈。

谢谢!

4 个答案:

答案 0 :(得分:4)

connection.setRequestProperty("Content-type", "application/x-www-form-urlencoded");

内容类型必须与postData实际格式匹配。仅当内容类型实际为url encoded时,才需要内容类型application/x-www-form-urlencoded。例如。你正在编写POST数据,如下所示:

String data = "param1=" + URLEncoder.encode(param1, "UTF-8")
           + "&param2=" + URLEncoder.encode(param2, "UTF-8");

这样,另一方就能够根据指定的格式解析数据而不会破坏它。

connection.setRequestProperty("Content-Length", Integer.toString(postData.length));

这对于确保强大的数据传输更为可取。如果省略这个并且连接以某种方式被破坏,那么另一方将永远无法确定内容是否完全流入。

也就是说,如果您知道请求方法将“自动”设置为HttpUrlConnection,那么转换为POST是不必要的:

connection.setDoOutput(true);

或在您的情况下更合适:

connection.setDoOutput("POST".equals(method));

答案 1 :(得分:3)

来自HTML规范文档:

  

如果表格的处理是   幂等的(即它没有持久性   对状态的可观察效果   世界),然后形式方法应该是   得到。许多数据库搜索没有   可见的副作用,使理想   查询表单的应用程序。        - -

If the service associated with the processing of a form has side effects
     

(例如,修改   数据库或订阅   服务),方法应该是POST。

它们大致相同,只是目的是主要区别。

答案 2 :(得分:3)

如果寻址的HTTP服务器需要,则需要设置内容类型标头。我们真的无法知道它是否存在。

如果你没有明确地设置内容长度标题,应该自动计算和设置内容长度标题,但是因为你事先知道它,我会设置它以便在实际发送数据之前HttpConnection不会不必要地缓冲你的内容

答案 3 :(得分:2)

对于修改内容的请求使用POST,对执行搜索的请求使用GET或只是获取文档。浏览器方面的区别在于浏览器避免意外再次发出POST请求,例如通过提示用户进行确认。

处理POST请求时,永远不要回复文档,而是将用户重定向到包含“提交的表单”或您想要提供的任何答案的GET请求。这避免了浏览器后退/前进按钮的问题,因为否则浏览响应页面需要重新提交POST请求。