Retrofit是Square公司开发的一款针对Android网络请求的一个当前很流行的网络请求库。
官网:http://square.github.io/retrofit/
github:https://github.com/square/retrofit
使用需引入:
- compile 'com.squareup.retrofit2:retrofit:2.1.0'
- compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
- compile 'io.reactivex:rxandroid:1.0.1'
- compile 'com.squareup.retrofit2:converter-gson:2.1.0'
Retrofit包含了多种网络请求方式,可根据参考选择。
全路径
- @GET(URL+"?platform=android&appkey=5a379b5eed8aaae531df5f60b12100cfb6dff2c1&c=member&a=getdepartments")
- Call<解析实体类> getInfo1();
@Query("key") String key用于接口键值对类型参数
- @GET("app.php")
- Call<UserInfo> getInfo2(@Query("platform") String platform, @Query("appkey") String appkey, @Query("c") String ip);
@QueryMap 如果Query参数比较多,那么可以通过@QueryMap方式将所有的参数集成在一个Map统一传递
扫描二维码关注公众号,回复:
228855 查看本文章
- @GET("app.php")
- Call<UserInfo> getInfoMap(@QueryMap Map<String,String> map);
注意:以上GET换成POST也是一样的效果
@Field("key") String key用于接口键值对类型参数
- @FormUrlEncoded
- @POST("app.php")
- Call<UserInfo> postField(@Field("platform") String bookId, @Field("appkey") String title,@Field("c") String content);
@FieldMap 如果Field参数比较多,那么可以通过@FieldMap方式将所有的参数集成在一个Map统一传递
- @FormUrlEncoded
- @POST("app.php")
- Call<UserInfo> postInfoMap(@FieldMap Map<String,String> map);
对于 Retrofit 中新的URL定义方式也是有一定要求的,版本不同有时格式也不一样,现在大多数2.0以上,@GET/POST()建议格式不要以 /开头,如:
- @POST("/app.php")
而是:URL以 / 结尾 如:(注:全路径则不影响)
- http://www.baidu.com/
代码:
定义接口 IRequestService .java
- @GET(URL+"app.php?platform=android&appkey=5a379b5eed8aaae531df5f60b12100cfb6dff2c1&c=member&a=getdepartments")
- Call<UserInfo> getInfo1();
- /*@Query("apikey") String apikey 用于接口键值对类型参数*/
- @GET("app.php")
- Call<UserInfo> getInfo2(@Query("platform") String platform, @Query("appkey") String appkey, @Query("c") String ip, @Query("a") String tag);
- /*@QueryMap 如果Query参数比较多,那么可以通过@QueryMap方式将所有的参数集成在一个Map统一传递*/
- @GET("app.php")
- Call<UserInfo> getInfoMap(@QueryMap Map<String,String> map);
使用
- Retrofit retrofit = new Retrofit.Builder()
- .baseUrl(urls)
- .addConverterFactory(GsonConverterFactory.create())
- .build();
- IRequestService service = retrofit.create(IRequestService.class);
- Call<DepartmentInfo> call=service.getInfo1();
- call.enqueue(new Callback<DepartmentInfo>() {
- @Override
- public void onResponse(Call<DepartmentInfo> call, Response<DepartmentInfo> response) {
- DepartmentInfo info=response.body();
- mTextView.setText(info.getError()+"-----"+info.getData().get(0).toString());
- Toast.makeText(getApplicationContext(),info.getError(),Toast.LENGTH_LONG).show();
- Log.i("tag", info.getData().get(0).getDepartname());
- Log.i("tag", info.getData().get(1).getDepartname());
- }
- @Override
- public void onFailure(Call<DepartmentInfo> call, Throwable t) {
- }
- });
Retrofit + RxJava结合使用
和上面差不多, 只不过不再是Call对象而是Observable对象,及RxJava中的事件源。
- @GET(URL+"app.php?platform=android&appkey=5a379b5eed8aaae531df5f60b12100cfb6dff2c1&c=member&a=getdepartments")
- Observable<UserInfo> getRxjava();
- @POST("app.php")
- Observable<UserInfo> getUserFollowingObservable(@QueryMap Map<String,String> map);
使用
- RxJavaCallAdapterFactory rxAdapter = RxJavaCallAdapterFactory.createWithScheduler(Schedulers.io());
- Retrofit retrofit11 = new Retrofit.Builder()
- .baseUrl(urls)
- .addConverterFactory(GsonConverterFactory.create())
- .addCallAdapterFactory(rxAdapter)
- .build();
- IRxJavaService apiService = retrofit11.create(IRxJavaService.class);
- Observable<DepartmentInfo> call = apiService.getUser(Util.showMap());
- subscription = call
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(new Subscriber<DepartmentInfo>() {
- @Override
- public void onCompleted() {
- }
- @Override
- public void onError(Throwable e) {
- }
- @Override
- public void onNext(DepartmentInfo user) {
- Toast.makeText(getApplicationContext(),
- user.getData().get(0).getDepartname(),
- Toast.LENGTH_SHORT)
- .show();
- }
- });
总结:
Retrofit的使用和理解简单的梳理了一遍,希望能够帮助大家更好地理解Retrofit的使用。