目录
一、原由:
二、解决
2.1 方法一
2.2 方法二
同事遇到一个问题:在Android下使用POST方式提交数据到服务器(服务器是基于Tomcat的SSM架构系统),但是总是请求失败,返回结果是400。
在网上查了各种资料,各种方式都尝试了,无果......
最后只能自己找了,发现是由于参数对应关系错误导致的,我最开始是这么写的(网上基本也是这说的):
Android 端代码:
private void testStringRequest() { String url="你的服务器地址"; Mapmap=new HashMap (); map.put("value1", "111111111111"); map.put("value2", "222222222222"); JSONObject params=new JSONObject(map); JsonObjectRequest objectRequest=new JsonObjectRequest(Request.Method.POST, url, params, new Response.Listener () { @Override public void onResponse(JSONObject obj) { } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }){ @Override public String getBodyContentType() { return "application/json; charset=UTF-8"; } }; objectRequest.setTag("post"); RequestQueue queue = Volley.newRequestQueue(this); queue.add(objectRequest); } 服务器端代码:
@ResponseBody @RequestMapping(value = "/test", method = RequestMethod.POST) public JsonVosetSyncStatus( @RequestParam(value="value1",required=true) String value1, @RequestParam(value="value2",required=true) String value2, HttpServletRequest request, ModelMap modelMap) throws Exception { JsonVo json = new JsonVo<>(); try { //一系列其他操作 }catch (Exception ex){ } return json; }
这种写法的错误就在于Android端传入的是JSON对象,而服务端使用URL参数来接收,导致两边参数对就不上,报400错误。
要解决这个问题使两边参数一致就可以了,解决办法有两种:
一是:Android以URL格式传入
二是:服务端以对象接收
服务端保持不变
@ResponseBody
@RequestMapping(value = "/test", method = RequestMethod.POST)
public JsonVo setSyncStatus(
@RequestParam(value="value1",required=true) String value1,
@RequestParam(value="value2",required=true) String value2,
HttpServletRequest request, ModelMap modelMap) throws Exception {
JsonVo json = new JsonVo<>();
//其他操作
return json;
}
修改Android端,重载getBodyContentType方法,指定内容类型为url格式;重载getBody方法,将post数据以url编码方式返回
private void testStringRequest() {
JsonObjectRequest objectRequest=new JsonObjectRequest(Request.Method.POST,url,
new Response.Listener() {
@Override
public void onResponse(JSONObject obj) {
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}){
@Override
public String getBodyContentType() {
return "application/x-www-form-urlencoded; charset=UTF-8";
}
@Override
public byte[] getBody() {
try {
return "value1=1111111111&value2=222222222".getBytes("UTF-8");
} catch (Exception e) {
return null;
}
};
objectRequest.setTag("post");
RequestQueue queue = Volley.newRequestQueue(this);
queue.add(objectRequest);
}
保持Android端不变:
private void testStringRequest() {
String url="你的服务器地址";
Map map=new HashMap();
map.put("value1", "111111111111");
map.put("value2", "222222222222");
JSONObject params=new JSONObject(map);
JsonObjectRequest objectRequest=new JsonObjectRequest(Request.Method.POST, url, params,
new Response.Listener() {
@Override
public void onResponse(JSONObject obj) {
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}){
@Override
public String getBodyContentType() {
return "application/json; charset=UTF-8";
}
};
objectRequest.setTag("post");
RequestQueue queue = Volley.newRequestQueue(this);
queue.add(objectRequest);
}
修改服务端代码:
添加一个接收参数的实体 XXXModel,并在Action中使用XXXModel来接收参数:
package xxxx;
public class XXXModel {
public String value1;
public String value2;
}
//在Spring MVC控制器的写法修改为如下:
@ResponseBody
@RequestMapping(value = "/test", method = RequestMethod.POST)
public JsonVo setSyncStatus(
@RequestBody XXXModel model,
HttpServletRequest request, ModelMap modelMap) throws Exception {
JsonVo json = new JsonVo<>();
//其他操作
return json;
}