Выполнение POST запросов с параметрами в GWT
Я пытаюсь сделать запрос POST с набором параметров для данного URL. Проблема, с которой я сталкиваюсь, заключается в том, что запрос 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, так как данные, которые будут передаваться, могут быть большими....
4 ответа:
Задайте заголовок вашего запроса:
builder.setHeader("Content-type", "application/x-www-form-urlencoded");
Это уже должно работать - но при использовании POST, вам придется прочитать представленные данные по-другому в вашем сервлете (я предполагаю, что вы используете Java на стороне сервера?)
Вы можете попробовать это с сервлетом, как это:
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()
в свой собственный буфер или строку и т. д.
Веб-форма не может использоваться для отправки запроса на страницу, использующую сочетание GET и POST. Если вы зададите методу формы значение GET, все параметры будут указаны в строке запроса. Если для метода формы задано значение POST, то все параметры находятся в теле запроса.
Источник: стандарт HTML 4.01, раздел 17.13 форма отправки url: http://www.w3.org/TR/html4/interact/forms.html#submit-format
Моя рекомендация такова:: Отбросьте подход с параметром.
Вместо этого используйте @RequestBody. Это намного чище. @RequestParam полезен только в том случае, если вы хотите сделать запрос GET на сервер для быстрого тестирования служб rest. Если вы имеете дело с данными любой степени сложности, лучше использовать POST-запросы к серверу, которые не имеют максимального ограничения содержимого.
Вот пример того, как перекачивать запрос на сервер. Примечание: В этом случае, если вы используете springboot как бэкэнд, вы должны были бы манипулировать типом контента FO быть 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.
С уважением.