使用xutils3 实现RESTful请求风格

背景:
最近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> 
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容