2010-10-21 22 views
16

Estoy tratando de hacer una solicitud POST con un conjunto de parámetros para una URL determinada. El problema que tengo es que se realiza la solicitud POST, pero no se pasan parámetros.Realización de solicitudes POST con parámetros en GWT

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 bien si uso el modo GET y añadir manualmente la cadena de consulta a la solicitud - pero necesito usar POST como los datos que se pasan a lo largo puede ser grande ....

Respuesta

24

Conjunto la cabecera de su solicitud:

builder.setHeader("Content-type", "application/x-www-form-urlencoded"); 
+1

Gracias! Mi servlet aceptador no funcionaba sin ... ¡nunca lo hubiera pensado! ¡Gracias! – Lenz

+0

¡Me alegro de poder ayudar! – z00bs

0

un formulario web no puede ser utilizado para enviar una petición a una página que utiliza una mezcla de GET y POST. Si establece el método del formulario en GET, todos los parámetros están en la cadena de consulta. Si configura el método del formulario en POST, todos los parámetros están en el cuerpo de la solicitud.

Fuente: 4.01 estándar HTML, sección 17.13 Forma de presentación url: http://www.w3.org/TR/html4/interact/forms.html#submit-format

1

Esto ya debería funcionar - pero cuando se usa POST, que tendrá que leer los datos presentados de forma diferente en el servlet (supongo, que' ? re el uso de Java en el lado del servidor)

usted podría tratar con un servlet como esto:

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 propia b uffer o cadena, etc.

0

Mi recomendación es: Elimine el enfoque de los parámetros.

Use el @RequestBody en su lugar. Es mucho más limpio. @RequestParam solo es útil si quiere hacer una solicitud GET al servidor para probar rápidamente los servicios de descanso. Si está tratando con datos de cualquier grado de complejidad, es mejor que use solicitudes POST para el servidor que no tienen un límite máximo de contenido.

Aquí hay un ejemplo de cómo enviar una solicitud al servidor. NOTA: en este caso, si usa Springboot como servidor, tendría que manipular el tipo de contenido para la aplicación/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 el UserLoginGwtRpcMessageOverlay es un trabajo de parche. Este no es un objeto serializable GwtRpc, es una clase que amplía el objeto gwt javascript.

Atentamente.

Cuestiones relacionadas