Создание POST-запросов с параметрами в GWT - PullRequest
16 голосов
/ 21 октября 2010

Я пытаюсь выполнить запрос 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 ]

24 голосов
/ 21 октября 2010

Установите заголовок вашего запроса:

builder.setHeader("Content-type", "application/x-www-form-urlencoded");
1 голос
/ 21 октября 2010

Это уже должно работать - но при использовании 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() в свой собственный буфер или строку и т. Д.

0 голосов
/ 26 ноября 2016

Моя рекомендация: отбросить подход с использованием параметров.

Вместо этого используйте @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.

С уважением.

0 голосов
/ 21 октября 2010

Веб-форму нельзя использовать для отправки запроса на страницу, которая использует сочетание GET и POST. Если вы установите метод формы GET, все параметры будут в строке запроса. Если вы установите метод формы POST, все параметры будут в теле запроса.

Источник: стандарт HTML 4.01, раздел 17.13 URL-адрес отправки формы: http://www.w3.org/TR/html4/interact/forms.html#submit-format

...