gwt smartgwt

Realización de solicitudes POST con parámetros en GWT.



smartgwt (4)

Estoy intentando realizar 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.

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 utilizo el modo GET y agrego manualmente la cadena de consulta a la solicitud, pero necesito usar POST, ya que los datos a transmitir pueden ser grandes ...


Establece el encabezado de tu solicitud:

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


Esto ya debería funcionar, pero cuando use POST, tendrá que leer los datos enviados de manera diferente en su Servlet (¿Supongo que está utilizando Java en el lado del servidor?)

Podrías intentarlo 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, puede copiar el contenido de req.getReader() o req.getInputStream() en su propio búfer o cadena, etc.


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

Utilice el @RequestBody en su lugar. Es mucho más limpio. @RequestParam solo es útil si desea realizar una solicitud GET al servidor para probar rápidamente los servicios de descanso. Si está tratando con datos de algún grado de complejidad, es mejor usar solicitudes POST al 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 está utilizando springboot como backend, tendría que manipular el tipo de contenido para 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); } }

Tenga en cuenta que UserLoginGwtRpcMessageOverlay es un parche de trabajo. Este no es un objeto serializable GwtRpc, es una clase que extiende el objeto javascript gwt.

Saludos.


No se puede usar un formulario web para enviar una solicitud a una página que utiliza una combinación 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: HTML 4.01 estándar, sección 17.13 Formulario url de envío: http://www.w3.org/TR/html4/interact/forms.html#submit-format