背景:
最近java后端,貌似流行RESTful风格,强制把与移动端接口写成这种,让移动端适配。
1、先上github地址:https://github.com/wyouflf/xUtils3
从官方说明可以看出xutis3是支持RESTful的请求方式,接下来开始调试之旅。
2、移动端集成
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
api 'org.xutils:xutils:3.5.0'
3、初始化
自定义application ,方法你肯定懂的
@Override
public void onCreate() {
super.onCreate();
x.Ext.init(this);
x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.
...
}
4、就可以开始使用啦,赶快写过按钮触发一个点击事件吧!
先看看get请求:
后端要求请求方式
--非REST的url:
http://...../x/testRest.do?name=zhangsan
--REST的url风格:
http://..../x/testRest/zhangsan (多个参数用/分割开而已)
移动端代码
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RequestParams params = new RequestParams("http://192.168.1.101:8080/x/testRest/zhang");
x.http().get(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
System.out.println(result);
Toast.makeText(MainActivity.this, "++" + result, Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
});
总结下:是不是感觉get请求就是把参数用“/”隔开了而已,减少了以前的键值对的key和=;
5、post请求怎么搞呢?
--非REST的url:
RequestParams params = new RequestParams("http://..../x/testRest");
//post提交的字段:?name=zhangsan&password=123
params.addBodyParameter("name","zhangsan");
params.addBodyParameter("password","123");
--REST的url风格:
要求把请求参数组装层json ,放入body中传输
移动端代码
btn_p.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RequestParams params = new RequestParams("http://192.168.1.101:8080/x/testRest");
User user = new User();
user.setName("zhangsan");
user.setPassword("123");
//利用工具对象转json
Gson gson = new Gson();
String u = gson.toJson(user);
//*************关键在下***************
params.setAsJsonContent(true);
params.setBodyContent(u);
//*************关键在上***************
System.out.println(u);
x.http().post(params, new Callback.CommonCallback<String>() {
@Override
public void onSuccess(String result) {
System.out.println(result);
Toast.makeText(MainActivity.this, "==" + result, Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
}
@Override
public void onCancelled(CancelledException cex) {
}
@Override
public void onFinished() {
}
});
}
});
6、服务端代码
框架使用springmvc
@Controller("xutilsController")
@RequestMapping("x")
public class XutilsController {
@RequestMapping(value = "/testRest/{name}", method = RequestMethod.GET)
@ResponseBody
public String testRest(@PathVariable(value = "name") String name) {
System.out.println("testRest的GET:" + name);
return "testRest的GET";
}
@RequestMapping(value = "/testRest" ,method = RequestMethod.POST,consumes = "application/json")
@ResponseBody
public String testRestP(@RequestBody User user) {
System.out.println("testRest的POST:"+user.toString());
return "testRest的POST";
}
}
7、按照上面的基本就可以请求了,但是可能后端会遇到一个错误,获取不到绑定的Json数据
HTTP Status 415 – Unsupported Media Type
怎么办?什么情况?
方式一:把请求参数中的对象改为String类型 却能接收,然后利用工具自己转成对象就ok;what?
@RequestMapping(value = "/testRest" ,method = RequestMethod.POST)
@ResponseBody
public String testRestP(@RequestBody String user) {
System.out.println("testRest的POST:"+user);
return "testRest的POST";
}
方式二:如果不想这样,在mvn中添加一个类似于这样的功能
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
方式三:网友提供的
<mvc:annotation-driven />
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.8</version>
<type>jar</type>
<scope>compile</scope>
</dependency>