技术日新月异,一天不跑,就out了!
早点的Android的网络请求框架android-async-http,Volley,XUtils早已被抛诸脑后,到前段时间的OKHttp,再到最近一段时间大火的Retrofit,封装的越来越好!代码越来越简洁!
Retrofit与okhttp共同出自于大名鼎鼎的Square公司,retrofit就是对okhttp又做了一层封装。把网络请求都交给给了Okhttp,下面就介绍一下Retrofit网络请求框架的使用!
①现在Retrofit官方最新版本是2.1.0,那么首先呢就是添加依赖了,在build.gradle中引入:
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-scalars:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
注意:我们导入的retrofit2各个包的版本号要一致,否则就会报错!
第二个包是我们ConverterFactory的String依赖包,也就是说我们的返回值是String,第二个包是我们ConverterFactory的Gson依赖包,我们的反正值是我们定义的Gson实体类。具体怎么使用,就要看我们在定义请求接口的时候,Call
泛型里边写的是谁!!!
②然后需要我们定义一个请求接口:
import retrofit2.Call;
import retrofit2.http.POST;
import retrofit2.http.Query;
/**
* Created by Admin on 2016/7/19.
*/
public interface RequestInterface {
//%e5%8c%97%e4%ba%ac为北京的URL编码,URLEncoder#encode("北京","UTF-8")
//以此URL为例
String URL = " http://api.36wu.com/Weather/GetWeather?district=%E5%8C%97%E4%BA%AC";
@POST("Weather/GetWeather")
Call getData(@Query("district") String district);
}
这里的URL是我在网上随便找的一个天气API接口,请求方式是POST,当然我们也可以使用GET请求!
@GET("{url}")
Call getData(@Path("url") String url);
Retrofit提供的请求方式注解有@GET和@POST,参数注解有@PATH和@Query等,@Query就是我们的请求的键值对的设置,我们构建Call对象的时候会传入此参数,这里的@Query("district")
就是键,后边的String district
就是对应的值。@PATH指的是通过参数填充完整的路径,这里的参数url会被填充至{url}中,形成完整的Url请求地址,{url}相当于一个占位符!
③接着给出我们的Gson实体类,因为这个API接口要申请appkey,我这里直接拿来用的所以返回的json信息是
{
"message":"该authkey错误或该authkey无权访问此接口,如商用请购买服务,试用请在线申请。",
"status":401
}
所以我就以该json数据创建一个Gson实体类
public class ResponseData {
private String message;
private String status;
@Override
public String toString() {
return "消息|"+message+"\n"+
"状态码|"+status;
}
}
说到这,说一个题外话,这样的json数据比较简单,当我们遇到比较复杂的json数据的时候,我们也应该按照对应的返回字段创建出对应的正确的Gson实体类。
可以参考一下下面这篇文章,写的比较清晰:
http://blog.csdn.net/tkwxty/article/details/34474501
④最后就是具体的使用了:
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("http://api.36wu.com/")
//增加返回值为String的支持
.addConverterFactory(ScalarsConverterFactory.create())
//增加返回值为Gson的支持(返回实体类)
.addConverterFactory(GsonConverterFactory.create())
.build();
//这里采用的是Java的动态代理模式,得到请求接口对象
RequestInterface
requestInterface=retrofit.create(RequestInterface.class);
//传入district的值,得到Call对象
Call call=requestInterface.getData("%E5%8C%97%E4%BA%AC");
//call#enqueue请求网络
call.enqueue(new Callback() {
@Override
public void onResponse(Call call, Response response) {
Log.d("response",response.body().toString());
}
@Override
public void onFailure(Call call, Throwable t) {
Log.d("failure","失败"+t.toString());
}
});
}
这里有一个需要注意的问题:就是baseUrl和@POST
的地址拼接问题,建议在baseUrl中最后加上/
,而不要在POST中地址开始使用/
,这样才是拼接的正确的Url结果,否则会出现各种你意向不到的情况!
这样整个网络请求就介绍完了,上面的打印结果:
消息|该authkey错误或该authkey无权访问此接口,如商用请购买服务,试用请在线申请。
状态码|401
如果我们在请求接口里边写的是Call
,那么得到的打印解果将是返回的整个json数据。
能力有限,分析的不透彻,我在简书上面看到stay大神的分析,收藏一下:
Retrofit分析-漂亮的解耦套路
http://www.jianshu.com/p/45cb536be2f4#
Retrofit分析-经典设计模式案例
http://www.jianshu.com/p/fb8d21978e38
鸿洋大神的一篇关于Retrofit的博客,值得一读:
Retrofit2 完全解析 探索与okhttp之间的关系
http://blog.csdn.net/lmj623565791/article/details/51304204