Ответ 1
Задайте заголовок вашего запроса:
builder.setHeader("Content-type", "application/x-www-form-urlencoded");
Я пытаюсь выполнить 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, поскольку передаваемые данные могут быть большими....
Задайте заголовок вашего запроса:
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 на сервер, чтобы быстро протестировать службы отдыха. Если вы имеете дело с данными любой степени сложности, вам лучше использовать POST-запросы на сервере, у которых нет максимального предела содержимого.
Вот пример того, как перенаправить запрос на сервер. ПРИМЕЧАНИЕ. В этом случае, если вы используете springboot в качестве backend, вам придется манипулировать типом контента 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.
С уважением.