我正从我的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:
我在这里缺少什么想法?
答案 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”作为标题。