今天说下关于网络的东西,公司的项目的网络请求都是用okhttp搭的,前阵子在网上看到Retrofit这东西,它跟okhttp一样都是Square公司,retrofit就是对okhttp做了一层封装。我觉得它对于okhttp的区别最大的一点就是用注解的方式来设置参数请求等。所以可以说RxAndroid跟它算是绝配。今天只是简单玩了下get请求。例子有点基础,我也在探究阶段0.0 好了。接下来进入正题吧
来看下项目中build.gradle文件的配置
其实本例子rxandroid还没讲到,所以只需要导入上三个retrofit的包就ok了。需要注意的是版本需要一样。
首先看下我完整的接口,里面是json字符串。http://litchiapi.jstv.com/api/GetFeeds?column=0&PageSize=20&pageIndex=2
分类一下,首先 http://litchiapi.jstv.com/ 我作为了baseUrl 。api/GetFeeds 这段我作为了get请求的url。column=0&PageSize=20&pageIndex=2 这些是请求的参数。上面的3段除了baseUrl其他都用注解的方式声明。
下面看下具体用法。首先我们先定义一个请求接口,看下代码:
/**
* Created by Administrator on 2016/9/29.
*/
public interface RetrofitTestInterface {
@GET("api/GetFeeds")
Call<Bean> getServiceBeans(@Query("column") int column,
@Query("PageSize") int pageSize,
@Query("pageIndex") int pageIndex);
}
上面用@GET声明了get请求的地址,@Query用来声明参数,多个请求的话我们还可以包装成Map,但是注解就不是@Query了,而是@QueryMap。时间原因,本例子没讲,后续我再加上,这里需要注意的是声明的参数需跟请求的Url的参数对应。下面我们看具体用法:
public class MainActivity extends AppCompatActivity {
private String TAG = "MainActivity";
private String baseUrl = "http://litchiapi.jstv.com/";
private Button mBtn;
private Call<Bean> serviceBeans;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mBtn = ((Button) findViewById(R.id.btn));
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
RetrofitTestInterface retrofitTestInterface = retrofit
.create(RetrofitTestInterface.class);
serviceBeans = retrofitTestInterface.getServiceBeans(0, 20, 2);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
serviceBeans.enqueue(new Callback<Bean>() {
@Override
public void onResponse(Call<Bean> call, Response<Bean> response) {
Log.e(TAG, "请求成功");
Log.e(TAG, response.body().getParamz().getFeeds().get(0).getData().getSubject());
}
@Override
public void onFailure(Call<Bean> call, Throwable t) {
}
});
}
});
}
}
我们通过 new Retrofit.Builder 方法来构建 Retrofit 对象,然后通过
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
设置基本url,添加gson解析器,就是表示需要用什么转换器来解析返回值,GsonConverterFactory.create()表示调用Gson库来解析json返回值。最后调用build()完成。
然后我们通过retrofit对象调用
RetrofitTestInterface retrofitTestInterface = retrofit
.create(RetrofitTestInterface.class);
来得到我们定义好的接口对象。
通过接口调用里面的方法然后传入参数得到Call:
serviceBeans = retrofitTestInterface.getServiceBeans(0, 20, 2);
最后我们通过call的异步得打请求得到的数据:
serviceBeans.enqueue(new Callback<Bean>() {
@Override
public void onResponse(Call<Bean> call, Response<Bean> response) {
Log.e(TAG, "请求成功");
Log.e(TAG, response.body().getParamz().getFeeds().get(0).getData().getSubject());
}
@Override
public void onFailure(Call<Bean> call, Throwable t) {
}
});
它有同步和异步两种请求方式,同步的话是通过call.execute().body();得到请求体。需要注意的是同步需要另开线程,而异步则不用。其中onResponse方法是请求成功的回调方法,而onFailure()方法是请求失败的回调。请求成功之后我们想要的数据已经解析好变成response对象。
点击按钮之后返回数据成功:
好了,是不是很简单。今天这个例子很基础。希望大家都能看懂。后续的话有时间再添加其他方式的使用介绍,毕竟它的功能确实很强大。
共勉