Hacer peticiones POST con los parámetros en GWT

Estoy tratando de hacer una petición POST con un conjunto de parámetros a una determinada URL. El problema que estoy teniendo es que el POST se hizo la petición, pero no se pasan parámetros.

    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) {}
}

Esto funciona muy bien si puedo usar el modo de OBTENER y agregar manualmente la cadena de consulta para la solicitud – pero necesito enviar un POST, ya que los datos se transmitan puede ser grande….

OriginalEl autor Lenz | 2010-10-21

4 Kommentare

  1. 24

    Establecer el encabezado de la solicitud:

    builder.setHeader("Content-type", "application/x-www-form-urlencoded");
    
    Gracias! Mi aceptor servlet no estaba funcionando sin…. nunca habría pensado en eso! Gracias!
    Me alegra poder ayudar!

    OriginalEl autor z00bs

  2. 1

    Esto ya debería de trabajo, pero cuando se utiliza el POST, vas a tener que leer los datos presentados de forma diferente en su Servlet (supongo que estás usando Java en el lado del servidor?)

    Podrías probar con un Servlet como este:

    public class MyServlet extends HttpServlet {
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                       throws ServletException, IOException {
    
            System.out.println(req.getReader().readLine());
        }
    }

    Por supuesto, usted puede copiar el contenido de req.getReader() o req.getInputStream() a su propio búfer o de cadena, etc.

    OriginalEl autor Chris Lercher

  3. 0

    Un formulario web no puede ser utilizado para enviar una solicitud a una página que utiliza una mezcla de GET y POST. Si establece el método del formulario para OBTENER, todos los parámetros se encuentran en la cadena de consulta. Si establece el método del formulario para PUBLICAR, todos los parámetros se encuentran en el cuerpo de solicitud.

    Fuente: HTML 4.01 estándar, la sección 17.13 Envío del Formulario url: http://www.w3.org/TR/html4/interact/forms.html#submit-format

    OriginalEl autor kospiotr

  4. 0

    Mi recomendación es:
    Colocar el parámetro de enfoque.

    Uso de la @RequestBody lugar. Es mucho más limpio.
    @RequestParam sólo es útil si usted quiere hacer LLEGAR una solicitud al servidor para probar rápidamente resto de los servicios.
    Si usted está tratando con los datos de cualquier grado de complejidad, que son mejores de POST peticiones al servidor que no tiene un max de contenido límite.

    Aquí es un ejemplo de cómo la bomba de una solicitud para el servidor.
    NOTA: en este caso, si usted está utilizando springboot como el backend, tendría que manipular el tipo de contenido fo ser 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);
            }
        }
    

    Nota la UserLoginGwtRpcMessageOverlay es un parche de trabajo. Este no es un GwtRpc serializable objeto, es una clase que extiende la gwt objeto de javascript.

    Se refiere.

    OriginalEl autor 99Sono

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea