使用xutils3 实现RESTful请求风格

背景:
最近java后端,貌似流行RESTful风格,强制把与移动端接口写成这种,让移动端适配。

1、先上github地址:https://github.com/wyouflf/xUtils3
从官方说明可以看出xutis3是支持RESTful的请求方式,接下来开始调试之旅。
2、移动端集成

  

          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() {
                    @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() {
                    @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中添加一个类似于这样的功能

        
            com.fasterxml.jackson.core
            jackson-databind
            2.9.5
        

方式三:网友提供的


   
        org.codehaus.jackson  
        jackson-mapper-asl  
        1.9.8  
        jar  
        compile  
  

你可能感兴趣的:(使用xutils3 实现RESTful请求风格)