Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,而OkHttp现在已经得到Google官方认可,不了解OKHttp的请查看本系列的前作。
老生长谈,先配置build.gradle:
当然别忘了在manifest加入访问网络的权限:
这次我们访问的网站产生了变化,我们用淘宝ip库,里面有访问接口的说明:
1. 请求接口(GET): /service/getIpInfo.PHP?ip=[ip地址字串]
2. 响应信息: (json格式的)国家 、省(自治区或直辖市)、市(县)、运营商
3. 返回数据格式:
其中code的值的含义为,0:成功,1:失败。
我们可以用JSON字符串转换成Java实体类(POJO)这个网站将Json转为实体类,经过修改的实体类如下:
IpModel.Java:
IpData.java:
Retrofit提供的请求方式注解有@GET和@POST等,分别代表GET请求和POST请求,我们在这里访问的界面是“getIpInfo.php”。参数注解有@PATH和@Query等,@Query就是我们的请求的键值对的设置,在这里@Query(“ip”)代表键,“String ip”则代表值。
这里的baseUrl加上之前@GET(“getIpInfo.php”)定义的参数形成完整的请求地址;addConverterFactory用于指定返回的参数数据类型,这里我们支持String和Gson类型。
用retrofit创建我们之前定义的IpService接口对象,并调用该接口定义的getIpMsg方法得到Call对象。
这里是异步请求网络,回调的Callback是运行在主线程的。得到返回的Response后将返回数据的country字段用Toast显示出来。如果想同步请求网络请使用 call.execute(),如果想中断网络请求则可以使用 call.cancel()。
完整的代码如下:
上文讲了Retrofit访问网络的基本方法,接下来我们来了解下Retrofit常用的请求参数。
请求方法除了上文讲到的@GET,还有@POST、@PUT、@DELETE、@HEAD、@OPTIONS、@PATCH、@HTTP。其中@HTTP用来替换以上7个,其他的分别对应着不同的请求方法,不明白的请查看Android网络编程(一)HTTP协议原理这一篇文章。
前面的例子就用了Query用来查询参数。
如果Query参数比较多,那么可以通过@QueryMap方式将所有的参数集成在一个Map统一传递。
@Path用来替换路径。
@Body与@POST注解一起使用,提供查询主体内容,其中ApiInfo是一个bean类。
@Headers用来添加头部信息,上面用的是固定头部,也可以采用动态头部:
@Multipart用来上传文件