2011-10-10 8 views
8

Envío una solicitud POST a un servidor desde mi aplicación Android. El servidor se desarrolla utilizando Spring Framework. El servidor recibe la solicitud pero el parámetro que estaba enviando es nulo/vacío (se muestra en el registro).Recepción de solicitud POST en el servidor (Spring Framework) desde la aplicación Android

El código utilizado para enviar solicitud POST es:

DefaultHttpClient hc=new DefaultHttpClient(); 
ResponseHandler <String> res=new BasicResponseHandler(); 

String postMessage = "json String"; 

HttpPost postMethod=new HttpPost("http://ip:port/event/eventlogs/logs"); 
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1);  
nameValuePairs.add(new BasicNameValuePair("json", postMessage)); 

postMethod.setEntity(new UrlEncodedFormEntity(nameValuePairs));  
hc.execute(postMethod,res); 

También he tratado de establecer HttpParams de la siguiente manera pero también ha fallado:

HttpParams params = new BasicHttpParams(); 
params.setParameter("json", postMessage); 
postMethod.setParams(params); 

El código del lado del servidor que recibió este solicitud es:

@RequestMapping(value = "/eventlogs/logs", method = RequestMethod.POST) 
public String logs(@ModelAttribute("json") String json) { 

    logger.debug("Received POST request:" + json); 

    return null; 
} 

El registrador de mensajes que estoy tala espectáculos:

Received POST request: 

¿Alguna idea que me falta aquí?

Respuesta

4

He utilizado el RequestParam anotación y funciona para mí. Ahora el código en el servidor es el siguiente:

@RequestMapping(value = "/eventlogs/logs", method = RequestMethod.POST) 
public String logs(@RequestParam("json") String json) { 
logger.debug("Received POST request:" + json); 

    return null; 
} 
+0

Y en el cliente especifica los parámetros como la entidad de la solicitud. Especificarlos como setParams aún no funcionará. –

+0

Tengo el mismo problema. cuando hago lo que dice, obtengo org.springframework.web.bind.MissingServletRequestParameterException: Required El parámetro entero 'channel' no está presente. Estoy enviando el parámetro del cliente de Android con el nombre básico valuepair. ¿Puede usted ayudar? – Emilla

+0

@Emilla es posible que su parámetro se pueda perder, luego márquelo como obligatorio = falso.Ver esta respuesta http://stackoverflow.com/a/3466851/867475 – rizzz86

7

Quizás Spring no está convirtiendo su cuerpo POST en Model. Si ese es el caso, no sabrá cuál es el atributo json en su Model porque no hay Model!

Eche un vistazo a Spring Documentation regarding mapping the request body.

Debe poder utilizar las implementaciones de Springs MessageConverter para hacer lo que quiera. Específicamente, eche un vistazo al FormHttpMessageConverter, que convierte los datos del formulario a/desde un MultiValueMap<String, String>.

@RequestMapping(value = "/eventlogs/logs", method = RequestMethod.POST) 
public String logs(@RequestBody Map<String,String> body) { 
    logger.debug("Received POST request:" + body.get("json")); 

    return null; 
} 

La adición de esta línea a su configuración XML debe permitir a la FormHttpMessageConverter por defecto:

<mvc:annotation-driven/> 
+0

Gracias @ nicholas.hauschild por su respuesta. He intentado la anotación RequestBody pero me devuelve el tipo de medio HTTP Error 415 Unsupported (http://www.checkupdown.com/status/E415.html). Después de eso, he reemplazado la anotación RequestBody por la anotación RequestParam y funciona. Ahora obtengo los parámetros de solicitud POST en el servidor. – rizzz86

2

Creo que necesita agregar un encabezado de tipo de contenido del cliente. El MessageConverter para JSON se registra con un par de tipo de contenido que aceptará, uno es application/json.

Si envía con un tipo de contenido no manejado por ningún MessageConvert no funcionará.

Intente añadir "Content-type: application/json" como un encabezado.

+0

Agregar encabezado Content-Type funciona para mí, gracias. –

Cuestiones relacionadas