为了账号安全,请及时绑定邮箱和手机立即绑定

Retrofit2+RxJava+Gson 使用补充

标签:
Android

定义各类Api接口

Retrofit为我们提供了丰富的标签来实现不同的请求方式,
定义请求的样式如下:

@GetObservable<T> fetch();

请求类型

每个请求类型Retrofit都提供了相应的标签,如下:
@GET @POST @PUT @DELETE

这些接口都支持一个字符串作为参数输入,像这样:
@GET("user/token")

传入的路径为相对路径,这些会加到在配置时设置的BaseUrl后面

这个路径可以使用{}包裹一个变量名,这样就可以在参数中传入这个变量名来修改请求的路径:

@GET("group/{id}/users")
Observable<User> groupList(@Path("id") int groupId);

GET请求

使用注解@Query

@GET("group/{id}/users")
Observable<User> groupList(@Path("id") int groupId,@Query("sort")String sort);

对应的url像这样baseUrl/group/id/users?sort=sort
如果有多个参数还可以使用@QueryMap

@GET("group/{id}/users")
Observable<User> groupList(@Path("id") int groupId,@QueryMap Map<String, String> options);

对于下载文件或者下载图片可能需要修改整个url,而且这个时候想要获得的是原始返回的内容,可以把返回类型设置ResponseBody即OkHttp的返回

@GETObservable<ResponseBody> downloadFile(@Url String url,@Header("Range")String range);

上面出现了@Header 使用来设置请求头信息,如果需要变化可以使用@Header在参数中设置,如果不用变化则使用@Headers 设置在方法上

@Headers("Cache-Control: public,max-age=640000")@GET("flight/choose-city")
Observable<SelectCityList> getCitySearchList();@Headers({    "Accept: application/vnd.github.v3.full+json",    "User-Agent: Retrofit-Sample-App"})@GET("users/{username}")
Observable<User> getUser(@Path("username") String username);

POST请求

提交一个Json格式的Post请求

@POST("user/login")
Observable<User> login(@Body LoginRequest loginRequest);

会对LoginRequest 使用Gson解析为json字符串发送请求

提交一个POST表单

@FormUrlEncoded@POST("user/user-feed-back")
Observable<JSONObject> feedback(@Field("content") String content);

注意一定要写上@FormUrlEncoded,对于多个Field 也有@FieldMap

当然也可以提交一个原始的OkHttp请求,修改下登陆接口:

@POST("user/login")
Observable<User> login(@Body RequestBody loginRequest);

关于@Multipart

@Multipart@PUT("user/photo")
Observable<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

Retrofit提供了一些封装,其他不能解决情况可以直接使用RequestBody 和 ResponseBody

GSON解析辅助

默认的Gson解析有时不能满足业务的需求,可能需要设置对Gson进行一些配置

.addConverterFactory(GsonConverterFactory.create(new Gson()))

可以在配置Gson转换时传入我们另行配置的Gson

比如我们想要对所有的解析异常都不报错,而是设置为null。

final static class SafeTypeAdapterFactory implements TypeAdapterFactory{  

        @Override  
        public  TypeAdapter create(Gson gson, final TypeToken type) {  
            final TypeAdapter delegate = gson.getDelegateAdapter(this,type);  
            return new TypeAdapter() {  
                @Override  
                public void write(JsonWriter out, T value) throws IOException {  
                    try {  
                        delegate.write(out, value);  
                    } catch (IOException e) {  
                        delegate.write(out, null);  
                    }  
                }  

                @Override  
                public T read(JsonReader in) throws IOException {  
                    try {  
                        return delegate.read(in);  
                    } catch (IOException e) {  
                        in.skipValue();  
                        return null;  
                    } catch (IllegalStateException e) {  
                        in.skipValue();  
                        return null;  
                    } catch (JsonSyntaxException e) {  
                        in.skipValue();  
                        if(type.getType() instanceof Class){  
                            try {  
                                return (T) ((Class)type.getType()).newInstance();  
                            } catch (Exception e1) {  

                            }  
                        }  
                        return null;  
                    }  
                }  
            };  
        }  
    }
Gson myGson = new GsonBuilder().registerTypeAdapterFactory(new SafeTypeAdapterFactory().create());


原文链接:http://www.apkbus.com/blog-822724-68249.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消