一.简单上手的Retrofit网络请求框架
Retrofit是Square公司的一个高效率HTTP网络请求开源库,使用它方便简洁 能够更好的帮助我们提高写代码的质量
retrofit gitHub项目地址:https://github.com/square/retrofit
retrofit 官网地址:http://square.github.io/retrofit/
文件配置使用
<uses-permission android:name="android.permission.INTERNET"/>//权限配置
compile 'com.squareup.retrofit2:retrofit:2.3.0' //retrofit
compile 'com.squareup.retrofit2:converter-gson:2.0.2'//使用gson解析对象
使用 retrofit2时 里边已经封装了 okhttp 所以当引用okhttp3时无需在gradle中导入okhttp 很方便
converter-gson 把解析的response.body()转换为bean对象 代码中有用到 addConverterFactory (GsonConverterFactory.create()) ,这里出了converter-gson 官网还提供了其它的对象转化解析
其中 addConverterFactory(ScalarsConverterFactory.create())
compile ‘com.squareup.retrofit2:converter-scalars:2.3.0’ 服务器返回的格式是字符串 如果想查看后台返回的原始json未被转化成对象的可添加这段代码使用如下:
@GET(“oil/region”)
Call show(….); 解析创建Retrofit 对象并调用.. return—> String s = response.body().toString();
Simple Demo 如下:
1定义接口方法
public interface IBiz{
@GET("oil/region")
Call<JiaYouZhan> show(@Query("city") String city, @Query("keywords") String kewords, @Query("page") String limit, @Query("format") String format, @Query("key") String key);
@POST("oil/region")
@FormUrlEncoded
Call<JiaYouZhan> getTransData(@FieldMap Map<String, String> map);
}
2接口方法调用
Retrofit2 的baseUlr 必须以 /(斜线) 结束
String url = "http://apis.juhe.cn/";
//若使用GsonConverFactiry 就要用squareup 封装的json
Retrofit retrofit = new Retrofit.Builder().baseUrl(url)
.addConverterFactory(GsonConverterFactory.create()).build();
IBiz biz = retrofit.create(IBiz.class);
// 异步请求 enqueue get 调用方法
Call<JiaYouZhan> call=biz.show("北京", "石油", "1", "1", "b07bf762d0671b3509f5230f569e1e8f");
call.enqueue(new Callback<JiaYouZhan>() {
@Override
public void onResponse(Call<JiaYouZhan> call, Response<JiaYouZhan> response){
JiaYouZhan jiaYouZhan=response.body();
Log.e("TAG", "=:" + jiaYouZhan.getResult().getData().get(1).getAddress() );
}
@Override
public void onFailure(Call<JiaYouZhan> call, Throwable t) {
}
});
//Post调用使用方法
Map<String,String>map=new HashMap<>();
map.put("city","北京");
map.put("keywords","石油");
map.put("page","1");
map.put("format","1");
map.put("key","b07bf762d0671b3509f5230f569e1e8f");
baseRequest.createService(QuestService.class).getTransData(map).enqueue(...);
//取消订阅
call.cancle();
1.Get请求
@GET("oil/region")
Call<JiaYouZhan> show(@Query("city") String city, @Query("keywords") String kewords, @Query("page") String limit, @Query("format") String format, @Query("key") String key);
注解
完整路径 如下: 这里我用的是聚合的免费试用接口
http://apis.juhe.cn/oil/region?city=""&keywords="" &page=1&format=1&key=""
(@Query(“city”) String city)–>查询参数并设置参数(Query(“city”))的值(String city)
@GET("api/myplan/{userid}")
Call<HomeBean> shouYe(@Path("userid") String userId, @Query("page") String responseType, @Query("limit") String limit);
如果完整路径
http://www.ceshi.com/api/plan/10006?page=1&limit=5
这里对应的参数分别是userid=10006 ,page=1 ,limit=5 这里有三个参数其中userid是个path路径则可以这么写
(@Path(“userid”) String userId)补全{ }里的路径 ,?后面的参数采取查询Query 方式
2.Post请求
当请求的参数少时可以采用此方式
@POST("oil/region")
@FormUrlEncoded
Call<JiaYouZhan> postshore(@Field("city") String city, @Field("keywords") String kewords, @Field("page") String limit, @Field("format") String format, @Field("key") String key);
当提交的参数较多时采用map 集合上传参数
@POST("oil/region")
@FormUrlEncoded
Call<JiaYouZhan> getTransData(@FieldMap Map<String, String> map);
这里的 Call<T>
实际上是个泛型接口 里边就6个方法 ,默认 T 是ResponseBody 类型即Call<ResponseBody>
但也可以是其他类型 .当然call 也可以被替换成 Observable<JiaYouZhan>
但是要配合Rxjava 使用才行
Response<T> execute() throws IOException;
void enqueue(Callback<T> callback);
void cancel();
boolean isCanceled();
all<T> clone();
Request request();
二.Retrofit2 和Rxjava2配合使用
除了以上的 gradle compile 另外还需要添加
//这个是将服务器返回的结果以字符串形式打出
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
//rxjava
compile "io.reactivex.rxjava2:rxjava:2.1.0"
// 配合Rxjava 一定要在retrofit 配置支持
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'//retrofit
//retrofit 线程调度配置需要引入改编译的gradle
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
定义接口方法:
当配置完成后稍微修改以上的代码之前没引入rxjava2 是call<> 引入完可以替换成Observable<>
public interface IBiz
{
@GET("oil/region")
Observable<JiaYouZhan> show(@Query("city") String city, @Query("keywords") String kewords, @Query("page") String limit, @Query("format") String format, @Query("key") String key);
}
代码调用:
String url = "http://apis.juhe.cn/";
Retrofit retrofit = new Retrofit.Builder().baseUrl(url).addConverterFactory(ScalarsConverterFactory.create()).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJava2CallAdapterFactory.create()).build();
IBiz biz= retrofit.create(IBiz.class);
biz.show("北京", "石油", "1", "1", "b07bf762d0671b3509f5230f569e1e8f"). subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<JiaYouZhan>() {
@Override
public void onSubscribe(@NonNull Disposable d) {}
@Override
public void onNext(@NonNull JiaYouZhan jiaYouZhan) {
Log.e("TAG", "=======:" + jiaYouZhan.getResult().getData().get(1).getAddress() + "");
System.out.print(jiaYouZhan.getResultcode());
}
@Override
public void onError(@NonNull Throwable e) {}
@Override
public void onComplete() {}
});
RxJava2CallAdapterFactory.create()支持rxjava
observerOn(Schedulers) 指定观察者Observer在哪个线程执行
subscribeOn(Scheduler) 指定被观察者Observable在哪个线程执行
这里我的代码是指定observeOn(AndroidSchedulers.mainThread()) 它的Observer 回调onnext方法里是可以操作ui线程的如不制定会报错