2010-03-26 224 views
3

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

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
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)); 
+0

谢谢,BalusC,这是一个非常有用的解释。 – littleK 2010-03-26 19:08:53

3

从HTML规范文档:

如果窗体的处理是 幂等(即,它具有对 世界的状态没有持续 观察到的效果),则形式方法应该是 得到。许多数据库搜索没有可见的副作用,并且使查询表单的理想应用程序成为可能。 - -

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

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

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

3

如果被寻址的HTTP服务器需要,您需要设置内容类型头。我们真的没有办法知道它是否是。

如果您没有明确设置内容长度标头,则应该自动计算和设置内容长度标头,但由于无论如何您都知道,因此我会将其设置为在实际发送内容之前不会通过HttpConnection缓冲您的内容数据。

2

使用POST来修改某些请求,GET请求执行搜索或只是获取文档。浏览器端的不同之处在于,浏览器避免了意外地再次执行POST请求,例如通过提示用户进行确认。

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