从Android应用程序接收服务器上的POST请求(Spring Framework)

时间:2011-10-10 14:18:40

标签: android spring post spring-mvc

我正从我的Android应用程序向服务器发送POST请求。服务器是使用Spring Framework开发的。服务器收到请求,但我发送的参数为空/空(显示在日志中)。

用于发送POST请求的代码是:

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); 

我还尝试按如下方式设置HttpParams,但它也失败了:

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

收到此请求的服务器端代码是:

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

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

    return null;
}

我正在记录的Logger消息显示:

Received POST request:

我在这里缺少什么想法?

3 个答案:

答案 0 :(得分:7)

也许Spring没有将您的POST机构转换为Model。如果是这种情况,则不会知道json上的Model属性是什么,因为没有Model

查看Spring Documentation regarding mapping the request body

您应该能够使用Springs MessageConverter实现来执行您想要的操作。具体来说,请查看FormHttpMessageConverter,它将表单数据转换为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;
}

将此行添加到xml配置中应默认启用FormHttpMessageConverter

<mvc:annotation-driven/>

答案 1 :(得分:4)

我使用了RequestParam Annotation,它适用于我。现在服务器上的代码如下:

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

    return null;
}

答案 2 :(得分:2)

我认为您需要从客户端添加内容类型标头。 MessageConverter for JSON将自己注册为一个它将接受的内容类型,一个是application / json。

如果您发送的内容类型未由任何MessageConvert处理,则无法使用。

尝试添加“Content-type:application / json”作为标题。