Retrofit是Android的一个非常好用的开源HTTP Request。现在介绍一下Retrofit是如何使用的。。。。
首先是导入Retrofit包,
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.0.0'
compile 'com.squareup.retrofit:retrofit:1.9.0'
}1234512345
然后是根据API的JSON数据建立一个数据类
URL:http://apistore.baidu.com/microservice/weather?citypinyin=beijing
{
errNum: 0,
errMsg: "success",
retData: {
city: "北京", //城市
pinyin: "beijing", //城市拼音
citycode: "101010100", //城市编码
date: "15-02-11", //日期
time: "11:00", //发布时间
postCode: "100000", //邮编
longitude: 116.391, //经度
latitude: 39.904, //维度
altitude: "33", //海拔
weather: "晴", //天气情况
temp: "10", //气温
l_tmp: "-4", //最低气温
h_tmp: "10", //最高气温
WD: "无持续风向", //风向
WS: "微风(<10m/h)", //风力
sunrise: "07:12", //日出时间
sunset: "17:44" //日落时间
}
}
123456789101112131415161718192021222324123456789101112131415161718192021222324
以下是数据类:
public class Result {
private String errNum
private String errMsg
private WeatherData retData
public void setErrNum(String errNum) {
this.errNum = errNum
}
public void setErrMsg(String errMsg) {
this.errMsg = errMsg
}
public WeatherData getRetData() {
return retData
}
public void setRetData(WeatherData retData) {
this.retData = retData
}
public String getErrNum() {
return errNum
}
public String getErrMsg() {
return errMsg
}
}
public class WeatherData {
private String city//城市
private String pinyin//城市拼音
private String citycode //城市编码
private String date//日期
private String time//发布时间
private String postCode//邮编
private String longitude//经度
private String latitude//维度
private String altitude//海拔
private String weather//天气情况
private String temp//气温
private String l_tmp//最低气温
private String h_tmp//最高气温
private String WD//风向
private String WS//风力
private String sunrise//日出时间
private String sunset//日落时间
//setter和getter就不贴了
}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
新建一个MyService的接口,由于之后要在主线程使用(安卓3.0以上主线程不能同步访问网络),所以这里采用异步获取的方式。故增加了Callback<Result >cb
import retrofit.Callback
import retrofit.http.GET
import retrofit.http.Query
public interface MyService {
// URI:http://apistore.baidu.com/microservice/weather?citypinyin=beijing
@GET("/microservice/weather")
void getResult(@Query("citypinyin") String citypinyin, Callback<Result>cb)
}12345678910111234567891011
使用RestAdapter来实例化MyService;
import retrofit.RestAdapter
public class MyRestClient {
private static String API_URL = "http://apistore.baidu.com"
public static MyService getService() {
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(API_URL)//设置站点路径
.setLogLevel(RestAdapter.LogLevel.FULL)//设置log的级别
.build()
MyService myService = restAdapter.create(MyService.class)
return myService
}
}123456789101112131415161718123456789101112131415161718
系统调用如下
@Override
public void onStart()
{
super.onStart()
MyRestClient.getService().getResult("beijing",new Callback<Result>() {
@Override
public void success(Result result, Response response) {
Log.i("",result.getRetData().getDate())
}
@Override
public void failure(RetrofitError error) {
}
})
}12345678910111213141516171234567891011121314151617
别忘了添加网络访问权限哟。
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
1、Retrofit创建2、Retrofit实现Cookie自动化管理
3、Retrofit,Gson解析,请求返回的类型不统一,假如double返回的是null
4、请求参数日志打印
5、统一请求参数添加到请求头中
6、统一请求参数添加到请求body中
7、缓存的拦截器
8、BaseUrl动态切换
9、拦截指定接口,动态更改返回值便于测试
点击传送查看
点击传送查看
1.第一种办法,依赖第三方库
配置信息如下
2.第二种办法,拦截器拦截(个人推荐第二种,可控性高)
给大家推荐一个打印日志库,很漂亮的日志结构
然后在httpClientBuilder中添加拦截
然后在httpClientBuilder中添加拦截
然后在httpClientBuilder中添加拦截
然后在httpClientBuilder中添加拦截
用了一个博客中民间大神的拦截动态替换baseUrl方法有点问题,我暂时用了一种简单粗暴方法
上边的路径是我随便写的,post中写全路径,这个优先级最高,同时设置了baseUrl不受影响
给大家一个专门写动态替换baseUrl连接 传送门
有时候我们需要返回指定值测试,可能需要空或者null等,迫于无法修改服务器返回数据,也没必要让后台修改数据,所以引发一个问题,如果拦截返回内容并修改指定字段值
然后在httpClientBuilder中添加拦截
Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装
1.添加Retrofit库的依赖:
后面三个是可选的,分别是数据解析器和gson,以及rxjava支持的依赖
2.创建 用于描述网络请求 的接口
Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数
3.创建Retrofit实例
4.发送请求
请求分为同步请求和异步请求
response.body()就是Reception对象,网络请求的完整 Url =在创建Retrofit实例时通过.baseUrl()设置 +网络请求接口的注解设置(下面称 “path“ )
整合的规则如下:
上面我们用了@GET注解来发送Get请求,Retrofit还提供了很多其他的注解类型
1.@GET、@POST、@PUT、@DELETE、@HEAD分别对应 HTTP中的网络请求方式
2.@HTTP替换@GET、@POST、@PUT、@DELETE、@HEAD注解的作用 及 更多功能拓展
具体使用:通过属性method、path、hasBody进行设置
1.@FormUrlEncoded
表示发送form-encoded的数据,每个键值对需要用@Filed来注解键名,随后的对象需要提供值。
2.@Multipart
表示发送form-encoded的数据(适用于 有文件 上传的场景),每个键值对需要用@Part来注解键名,随后的对象需要提供值。
1.@Header &@Headers
添加请求头 &添加不固定的请求头
2.@Body
以 Post方式 传递 自定义数据类型 给服务器,如果提交的是一个Map,那么作用相当于 @Field,不过Map要经过 FormBody.Builder 类处理成为符合 Okhttp 格式的表单,如:
3.@Field &@FieldMap
发送 Post请求 时提交请求的表单字段,与 @FormUrlEncoded 注解配合使用
4.@Part &@PartMap
发送 Post请求 时提交请求的表单字段,与@Field的区别:功能相同,但携带的参数类型更加丰富,包括数据流,所以适用于 有文件上传 的场景,与 @Multipart 注解配合使用
5.@Query和@QueryMap
用于 @GET 方法的查询参数(Query = Url 中 ‘?’ 后面的 key-value)
如:url = http://www.println.net/?cate=android ,其中,Query = cate
配置时只需要在接口方法中增加一个参数即可:
6.@Path
URL地址的缺省值
7.@Url
直接传入一个请求的 URL变量 用于URL设置
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)