我在使用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();
}
如果是这样,为什么?有什么不同?我将不胜感激任何反馈。
谢谢!
答案 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")
+ "¶m2=" + 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请求。