网络模块之retrofit

1、Retrofit是什么?

Retrofit是与web服务器提供的API接口(URL)进行通信的库。

2、Retrofit、Volley、OkHttp等的关系

1、volley是一个简单的异步Http的库,仅此而已。缺点是不支持同步,这点会限制开发模式;不能post大数据,所以不适合用来上传文件。
2、android_async_http:与volley不一样的是异步网络库。但volley是封装的httpUrlConnection,它是封装的httpClient,而android平台不推荐用HttpClient了,因为这个库已经不适合android平台了。
3、okhttp:是高性能的http库,支持同步、异步,而且实现了spdy、http2、websocket协议,api很简洁易用,和volley一样实现了http协议的缓存。picasso就是利用okhttp的缓存机制实现其文件缓存,实现的很优雅,很正确。反例就是URL,自己做得文件缓存,而且不遵守http缓存机制。
4、retrofit与picasso一样都是在okhttp基础之上做的封装。项目中直接就可用了。
*但是还有一个常识性的错误:volley、retrofit、android_async_http帮你封装了具体的请求,线程切换以及数据转换。而OkHttp是基于http协议封装的一套请求客户端,虽然它也可以开线程,但根本上它更偏向于真正的请求,跟HttpClient、HttpUrlConnection的职责是一样的。

3、Retrofit的示例

添加依赖和权限

在build.gradle文件中添加依赖,在Mainfest.xml文件中添加所需的网络权限
compile 'com.squareup.retrofit:retrofit:2.0.1-beta2'
compile 'com.squareup.retrofit:converter-gson:2.0.0-beta2'

// AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />

先通过一个简单的demo,整体认识一下Retrofit是怎么工作的。
示例需要访问的URL:https://api.github.com/users/jantxue
1、根据URL来构造一个java接口,接口名称可自定义
public interface APIInterface {
  @GET("/users/{user}")
  Call<TestModel> repo(@Path("user") String user);
这个接口负责URL中hostname和port后的部分

hostname和port会在构造Retrofit对象时,添加一个baseUrl(https://api.github.com)。在此GET的意思是,发送一个GET请求,请求地址为:baseUrl+"/users/{user}"。{user}类似于占位符的作用,具体类型由repo(@Path("user")String user)指定,这里表示{user}将是一段字符串。

定义Model

请求会将JSON数据转化为java实体类,所以我们需要自定义一个Model
public class TestModel {
  private String login;

  public String getLogin() {
    return login;
  }

  public void setLogin(String login) {
    this.login = login;
  }
}

进行连接通信

现在我们有了要链接的Http接口和要返回的数据结构,就可以执行请求了:
首先 ,要先构造一个Retrofit
Retrofit retrofit= new Retrofit.Builder()
.baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
注意:这里添加的baseUrl和GsonConverter,前者表示要访问的网站是,后者是添加了一个转换器。
接着 ,创建我们的API接口对象,这里ApiInterface是我们创建的接口:
APIInterface service = retrofit.create(APIInterface.class);
使用ApiInterface创建一个请求对象:
Call<TestModel> model = service.repo("Guolei1130");
注意这里的 .repo("Guolei1130") 取代了前面的 {user}。到这里,我们要访问的地址就成了:
可以看出这样的方式有利于我们使用不同的参数访问一个web API接口,比如你可以随意改成.repo("zhangsan");

最后 ,就可以发送请求了:
model.enqueue(new Callback<TestModel>() {
  @Override
  public void onResponse(Call<TestModel> call, Response<TestModel> response) {
    // Log.e("Test", response.body().getLogin());
    System.out.print(response.body().getLogin());
  }

  @Override
  public void onFailure(Call<TestModel> call, Throwable t) {
    System.out.print(t.getMessage());
  }
  });
至此,我们就利用Retrofit完成了一次网络请求。

未完待续。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值