我正在尝试使用一组参数对给定的URL执行POST请求。我遇到的问题是POST请求,但没有传递参数。
RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, url);
StringBuilder sb = new StringBuilder();
for ( String k: parmsRequest.keySet() ) {
String vx = URL.encodeComponent( parmsRequest.get(k));
if ( sb.length() > 0 ) {
sb.append("&");
}
sb.append(k).append("=").append(vx);
}
try {
Request response = builder.sendRequest( sb.toString(), new RequestCallback() {
public void onError(Request request, Throwable exception) {}
public void onResponseReceived(Request request, Response response) {}
});
} catch (RequestException e) {}
}
如果我使用模式GET并手动将查询字符串添加到请求中,这可以正常工作 - 但我需要使用POST,因为要传递的数据可能很大....
答案 0 :(得分:24)
设置请求的标头:
builder.setHeader("Content-type", "application/x-www-form-urlencoded");
答案 1 :(得分:1)
这应该已经可以了 - 但是当使用POST时,你必须在Servlet中以不同方式读取提交的数据(我假设你在服务器端使用Java?)
您可以尝试使用这样的Servlet:
public class MyServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println(req.getReader().readLine());
}
}
当然,您可以将req.getReader()
或req.getInputStream()
的内容复制到您自己的缓冲区或字符串等中。
答案 2 :(得分:0)
Web表单不能用于向使用GET和POST混合的页面发送请求。如果将表单的方法设置为GET,则所有参数都在查询字符串中。如果将表单的方法设置为POST,则所有参数都在请求正文中。
来源:HTML 4.01标准,第17.13节表格提交网址:http://www.w3.org/TR/html4/interact/forms.html#submit-format
答案 3 :(得分:0)
我的建议是: 删除参数方法。
请改用@RequestBody。它更清洁。 @RequestParam仅在您希望对服务器执行GET请求以快速测试休息服务时才有用。 如果您正在处理任何复杂程度的数据,那么最好使用没有最大内容限制的服务器的POST请求。
以下是如何将请求提取到服务器的示例。 注意:在这种情况下,如果您使用springboot作为后端,则必须操作application / json的内容类型。
private void invokeRestService() {
try {
// (a) prepare the JSON request to the server
RequestBuilder builder = new RequestBuilder(RequestBuilder.POST, JSON_URL);
// Make content type compatible with expetations from SpringBoot
// rest web service
builder.setHeader("Content-Type", "application/json;charset=UTF-8");
// (b) prepare the request object
UserLoginGwtRpcMessageOverlay jsonRequest = UserLoginGwtRpcMessageOverlay.create();
jsonRequest.setUserName("John777");
jsonRequest.setHashedPassword("lalal");
String jsonRequestStr = JsonUtils.stringify(jsonRequest);
// (c) send an HTTP Json request
Request request = builder.sendRequest(jsonRequestStr, new RequestCallback() {
// (i) callback handler when there is an error
public void onError(Request request, Throwable exception) {
LOGGER.log(Level.SEVERE, "Couldn't retrieve JSON", exception);
}
// (ii) callback result on success
public void onResponseReceived(Request request, Response response) {
if (200 == response.getStatusCode()) {
UserLoginGwtRpcMessageOverlay responseOverlay = JsonUtils
.<UserLoginGwtRpcMessageOverlay>safeEval(response.getText());
LOGGER.info("responseOverlay: " + responseOverlay.getUserName());
} else {
LOGGER.log(Level.SEVERE, "Couldn't retrieve JSON (" + response.getStatusText() + ")");
}
}
});
} catch (RequestException e) {
LOGGER.log(Level.SEVERE, "Couldn't execute request ", e);
}
}
注意UserLoginGwtRpcMessageOverlay是一个补丁工作。这不是GwtRpc可序列化对象,它是一个扩展gwt javascript对象的类。
问候。