上一篇学习了okhttp的入门篇,这一篇学习的retrofit底层默认使用的就是okhttp,相信大家多少也听过这个框架,下面我们就来一起学习下,讲真,学会之后这个框架用起来真的很爽,特别灵活。
按照习惯先来说一下它的优缺点
优点:
可以配置不同HTTP client来实现网络请求,如okhttp、httpclient等
请求的方法参数注解都可以定制
支持同步、异步和RxJava
超级解耦
可以配置不同的反序列化工具来解析数据,如json、xml等
使用非常方便灵活
框架使用了很多设计模式(感兴趣的可以看看源码学习学习)
缺点:
不能接触序列化实体和响应数据
执行的机制太严格
使用转换器比较低效
只能支持简单自定义参数类型
相关学习资料的网址
retrofit官网:http://square.github.io/retrofit/
github地址:https://github.com/square/retrofit
Simple HTTP with Retrofit2:
https://realm.io/news/droidcon-jake-wharton-simple-http-retrofit-2/
环境配置
在builde.gradle里面添加上
compile'com.squareup.retrofit2:retrofit:2.1.0'compile'com.squareup.retrofit2:converter-gson:2.1.0'compile'com.squareup.okhttp3:okhttp:3.4.1'
在AndroidManifest.xml添加所需权限
基本使用
get异步请求
.baseUrl设置最基本url,也就是http请求的url前缀,可以把项目中重复的前缀用这个来设置
.addConverterFactory(GsonConverterFactory.create())是添加Gson数据解析ConverterFactory,后面会专门介绍下这个,这里就不做过多解释
ResponseBody这个是okhttp里面的对象,可以直接返回整个字符串,也可以获取流的形式
post异步请求
POST与GET实现基本上是一样的,只是把注解GET换成POST就OK.为了测试POST,专门去网上找了个接口测试,下面就分享给大家,既可以用GET也可以用POST请求
http://www.kuaidi100.com/query?type=快递公司代号&postid=快递单号 ps:快递公司编码:申通="shentong"EMS="ems"顺丰="shunfeng"圆通="yuantong"中通="zhongtong"韵达="yunda"天天="tiantian"汇通="huitongkuaidi"全峰="quanfengkuaidi"德邦="debangwuliu"宅急送="zhaijisong"
拿着这个接口来实现一下POST异步请求
http://www.bejson.com/knownjson/webInterface/这网站里面还有一些其它免费接口,感兴趣的可以去看看
常用注解的使用介绍
上面GitHubService里面的注解大家应该都能猜它的作用了吧,下面就给大家介绍下
@GET和@POST分别是get和post请求。括号里面的value值与上面.baseUrl组成完整的路径
@Path动态的URL访问。像上面get请求中的{user}可以把它当做一个占位符,通过@Path("user")标注的参数进行替换
@Query请求参数。无论是GET或POST的参数都可以用它来实现
@QueryMap请求参数使用Map集合。可以传递一个map集合对象
@Body实体请求参数。顾名思义可以传递一个实体对象来作为请求的参数,不过实体属性要与参数名一一致
@FormUrlEncoded和@Field简单的表单键值对。两个需要结合使用,使用如下:
@FormUrlEncoded@POST("user/edit")Call updateUser(@Field("first_name") String first, @Field("last_name") String last);
@Multipart和@PartPOST表单的方式上传文件可以携带参数。两个需要结合使用,使用方式查看下面文件上传中介绍。
@PartMap和@PartPOST表单上传多个文件携带参数。两个结合使用,使用方式查看下面文件上传中介绍。
这里只介绍了一些常用的,大家如果想了解更多可以查看相关文档
文件上传
1、单文件上传携带参数(使用注解@Multipart和@Part),需要在手机SD卡目录下的Pictures文件夹下添加xuezhiqian.png图片
@Multipart@POST("UploadServlet")Call uploadfile(@Part MultipartBody.Part photo, @Part("username") RequestBody username, @Part("password") RequestBody password);
2、多文件上传携带参数(使用注解@PartMap和@Part),需要再在手机SD卡目录下的Pictures文件夹下添加xuezhiqian2.png图片
@Multipart@POST("UploadServlet")Call uploadfile(@PartMap Map params, @Part("password") RequestBody password);
文件下载
可以采用OKHTTP下载文件的方式,利用ResponseBody对象,调用response.body().byteStream()方法获取InputStream输入流,通过写文件操作来实现。
同步请求和结合RxJava的使用
1、同步请求
Call.execute()同步请求网络,要注意的是Android4.0以后不能在主线程里调用,要开一个异步线程来使用,
Call.enqueue()异步请求网络,加入一个回调,同步异步需要可按照不同的场景来使用。
Call.cancel()取消此次请求,有一些场景还是会用到该方法的。
2、结合RxJava使用
@POST("query")Observable searchRx(@Query("type") String type, @Query("postid") String postid);
配置OKHttp
链接:https://www.jianshu.com/p/a94e38636fde