网络框架之_Retrofit2
概述
- Restrofit框架是Square公司出品的网络框架;运用注解和动态代理,极大的简化了网络请求的繁琐步骤,非常适合处理Restful网络请求。
- 主要特点:
- 性能好,处理快,使用简单。目前android最流行的Http库之一(速度比Volley更快)
- 使用Rest api很方便
- 支持NIO(新的IO的API,可以替代标准的Java IO API)
- Retrofit默认使用OKHttp处理网络请求,默认使用Gson解析
如何引用
- 在build.gradle中添加引用
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
- 同步后External Libraries中添加:
Retrofit2中常用的注解接口
- @GET GET网络请求方式
- @Headers 头信息参数
- @Path 路径参数。替换url中“{”和“}”所括的部分
- @Query 查询参数。将在url地址中追加类似”name=user”的字符串,组成提交给服务器端的请求参数
- @QueryMap 查询参数集合。在url地址中追加类似“page=1&size=20”的字符串
@Url URL参数,此时@Get后无需内容
@POST POST网络请求方式
Http使用方式
具体步骤如下
- 定义一个接口(封装url地址和数据请求)
- 实例化Retrofit
- 通过Retrofit创建接口服务对象
- 接口服务对象调用接口中的方法,获取Call对象
- Call对象执行请求(异步,同步请求)
Retrofit2中的Url中定义
- 总结起来:
- 基本的url 要以 / 结尾
- 拼接的path 不要以/开头
Get网络请求中接口的写法
Get请求,方法中无参数
@GET("article/list/latest?page=1") Call<ResponseBody> getData();
Get请求,方法中指定@Path参数和@Query参数。@path参数用于替换url中{}的部分,@Query将在url地址中追加类似”page=1”的字符串
@GET("article/list/{type}?") Call<QSBean> getInfoData(@Path("type") String type, @Query("page") int page);
Get请求,提交表单数据。方法中定义@QueryMap参数。@QueryMap将url地址中追加类似“type=text&count=30&page=1”的字符串;
@GET("lll/register") Call<ResponseBody> getRegInfo(@QueryMap Map<String, String> map);
Get请求,方法中无参数。但是@Get中定义了完整的路径,这种情况下baseurl会被忽略
@GET("http://img4q.duitang.com/uploads/people/201604/15/20160415120706_BT8UE.jpeg") Call<ResponseBody> getImg();
Get请求,@Url用法
@GET Call<ResponseBody> getImg(@Url String url);
Retrofit下载文件,会直接读到内存中,这样如果下载的文件很大,就会报OOM异常。大文件的下载,为了避免OOM的发生,需要边下载到内存,边保存到sd卡里。。
@Streaming @GET Call<ResponseBody> getBigData(@Url String url);
Post访问接口中的写法
@Field参数;分别指定表单控件的名称。
@FormUrlEncoded @POST("app/gift/gift_list/") Call<ResponseBody> postGiftList(@Field("platform") String platform, @Field("gifttype") String gifttype, @Field("compare") String compare);
@FieldMap参数:通过map集合指定所有表单控件名称
@FormUrlEncoded @POST("app/gift/gift_list/") Call<ResponseBody> postGiftListMap(@FieldMap Map<String, String> map);
@Part参数:指定file控件的名称以及上传后文件的名称
@Body参数:向服务器上传多个文件以及其他表单域数据
代码如下:
IService
public interface IService {
//=======================================================================
// GET请求方式
//=======================================================================
@GET("v2/channels/100/items?limit=20&ad=2&gender=1&offset=0&generation=1")
Call<ResponseBody> getData();
@GET("article/list/{type}?")
Call<ResponseBody> getInfoData(@Path("type") String type, @Query("page") int page);
@GET("article/list/{type}?")
Call<QSBean> getBeanData(@Path("type") String type, @Query("page") int page);
@GET("v2/channels/100/items?")
Call<ResponseBody> getQueryData(@QueryMap Map<String, String> map);
@GET
Call<ResponseBody> getImg(@Url String url);
//=======================================================================
// Post方式
//=======================================================================
//`platform=2&gifttype=1&compare=60841c5b7c69a1bbb3f06536ed685a48
@FormUrlEncoded
@POST("app/gift/gift_list/")
Call<ResponseBody> postField(@Field("platform") int platform,
@Field("gifttype") int type,
@Field("compare") String compare);
@FormUrlEncoded
@POST("app/gift/gift_list/")
Call<ResponseBody> postFieldMap(@FieldMap Map<String, String> params);
}
Constant
public interface Constant {
//
String BASE_URL = "http://api.liwushuo.com/";
String BASE_URL_QB = "http://m2.qiushibaike.com/";
String BASE_URL_PIC = "http://img4q.duitang.com/";
String BASE_URL_GIFT="http://zhushou.72g.com/";
}
GetActivity
public class GetActivity extends AppCompatActivity {
@BindView(R.id.tv_result)
TextView mTvResult;
@BindView(R.id.btn_get_url)
Button mBtnGetUrl;
@BindView(R.id.btn_query)
Button mBtnQuery;
@BindView(R.id.btn_querymap)
Button mBtnQuerymap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_get);
ButterKnife.bind(this);
}
@OnClick({R.id.btn_get_url, R.id.btn_query, R.id.btn_querymap})
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_get_url:
loadGetData();
break;
case R.id.btn_query:
// queryInfo();
queryData();
break;
case R.id.btn_querymap:
queryMapData();
break;
}
}
private void loadGetData() {
//2. 创建出来Retrofit实例对象
//必须添加一个基本的url
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.BASE_URL) //添加基本的url
.build();
//3.创建出来接口IService的实例对象
IService iService = retrofit.create(IService.class);
//4.调用接口中定义的方法,去得到返回值
Call<ResponseBody> call = iService.getData();
//5.通过Call对象,可以进行同步网络请求,或者异步网络请求
//5.1同步方式
// try {
// Response<ResponseBody> response = call.execute();
// } catch (IOException e) {
// e.printStackTrace();
// }
//5.2异步方式
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Log.i("tag", "onResponse:" + Thread.currentThread().getName() + ":" + Thread.currentThread().getId());
//TODO 当前方法运行在主线程,可以直接更新UI
//请求成功时,可以通过第二个参数得到响应对象。
try {
String result = response.body().string();
mTvResult.setText(result);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
//TODO 当前请求失败的方法,运行在主线程,可以直接更新UI
}
});
}
private void queryInfo() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.BASE_URL_QB)
.build();
IService iService = retrofit.create(IService.class);
Call<ResponseBody> call = iService.getInfoData("latest", 1);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
String result = response.body().string();
QSBean qsBean = new Gson().fromJson(result, QSBean.class);
mTvResult.setText(qsBean.getCount() + "");
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
private void queryData() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.BASE_URL_QB)
.addConverterFactory(GsonConverterFactory.create()) //加上Gson解析器,内部会自动把得到的json字符串,转换成相应的bean对象
.build();
IService iService = retrofit.create(IService.class);
Call<QSBean> call = iService.getBeanData("latest", 1);
call.enqueue(new Callback<QSBean>() {
@Override
public void onResponse(Call<QSBean> call, Response<QSBean> response) {
QSBean bean = response.body();
mTvResult.setText(bean.getErr() + ":" + bean.getPage());
}
@Override
public void onFailure(Call<QSBean> call, Throwable t) {
}
});
}
private void queryMapData() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.BASE_URL)
.build();
IService iService = retrofit.create(IService.class);
//limit=20&ad=2&gender=1&offset=0&generation=1
Map<String, String> params = new HashMap<>();
params.put("limit", "20");
params.put("ad", "2");
params.put("gender", "1");
params.put("offset", "0");
params.put("generation", "1");
Call<ResponseBody> call = iService.getQueryData(params);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
ResponseBody responseBody = response.body();
try {
String reslut = responseBody.string();
mTvResult.setText(reslut);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
}
PostActivity
public class PostActivity extends AppCompatActivity {
@BindView(R.id.btn_field)
Button mBtnField;
@BindView(R.id.btn_field_map)
Button mBtnFieldMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_post);
ButterKnife.bind(this);
}
@OnClick({R.id.btn_field, R.id.btn_field_map})
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_field:
postField();
break;
case R.id.btn_field_map:
postFieldMap();
break;
}
}
private void postField() {
////`platform=2&gifttype=1&compare=60841c5b7c69a1bbb3f06536ed685a48
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constant.BASE_URL_GIFT)
.build();
IService iService = retrofit.create(IService.class);
Call<ResponseBody> call = iService.postField(2, 1, "60841c5b7c69a1bbb3f06536ed685a48");
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
String result = response.body().string();
System.out.println(result);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
private void postFieldMap(){
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(Constant.BASE_URL_GIFT)
.build();
IService iService = retrofit.create(IService.class);
Map<String,String> params=new HashMap<>();
params.put("platform","2");
params.put("gifttype","1");
params.put("compare","60841c5b7c69a1bbb3f06536ed685a48");
Call<ResponseBody> call = iService.postFieldMap(params);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
String result = response.body().string();
System.out.println(result);
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
}