Retrofit2 源码解读

转载请注明本文出自maplejaw的博客(http://blog.csdn.net/maplejaw_

开源库地址:https://github.com/square/retrofit
解读版本:2.1.0

基本概念

Retrofit 是一个针对Java/Android类型安全的Http请求客户端。
基本使用如下:

  1. 首先定义一个接口,抽象方法的返回值必须为Call<XX>

    public interface GitHubService {
         
      @GET("users/{user}/repos")
       Call<List<Repo>> listRepos(@Path("user") String user);//默认CallAdapter返回值必须为`Call<XX>`。
     }
  2. 通过Retrofit的create创建接口实现

    //初始化Retrofit
    Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/") //必须以斜杠结尾
    .addConverterFactory(GsonConverterFactory.create())//添加Gson转换工厂
    .build();
    
    //通过Retrofit创建接口实现
    GitHubService service = retrofit.create(GitHubService.class);
  3. 接口调用相关方法获取Call<XX>,然后就能和Okhttp一样进行同步/异步调用。

    Call<List<Repo>> repos = service.listRepos("octocat");
    //异步调用
    repos.enqueue(new Callback<List<Repo>>() {
            @Override
            public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {
                     List<String> list=response.body();//调用body()
            }
    
            @Override
            public void onFailure(Call<List<Repo>> call, Throwable t) {
    
            }
        });
     //同步调用
      Response<List<Repo>> response=repos.execute();

源码解读

Retrofit中的相关注解

请求方法注解

该类注解用于指明请求方法,在使用时必须指定且只可指定一种请求方法。

  1. @GET
    用来指明请求方法和相对/绝对/完整路径。当然也可以配合@Url使用。

    public interface RequestService {
         
       @GET("xx/xxx") //指定相对路径
       Call<ResponseBody> getContent1();
    
       @GET("/xxx") //指定绝对路径,相对路径和绝对路径的区别见后文
       Call<ResponseBody> getContent1();
    
       @GET("http://www.baidu.com") //指定完整Url
       Call<ResponseBody> getContent2();
    
       @GET //配合@Url使用,此时@GET只能指明请求方法,路径参数必须留空
       Call<ResponseBody> getContent3(@Url String url);
     }
  2. @POST
    用来指明请求方法和相对/绝对/完整路径,同时也可以配合@Url使用。

    public interface RequestService {
         
       @POST("xx/xxx") //指定相对路径
       Call<ResponseBody> getContent1();
       @POST("/xxx") //指定绝对路径
       Call<ResponseBody> getContent1();
       @POST("http://www.baidu.com") //指定完整Url
       Call<ResponseBody> getContent2();
    
       @POST //配合@Url使用,此时@POST只能指明请求方法,路径参数必须留空
       Call<ResponseBody> getContent3(@Url String url);
     }
  3. @DELETE,@HEAD,@OPTIONS,@PATCH,@PUT
    这几种请求方法和POST/GET在使用上没有太大区别,由于不太常用,这里就不做介绍。
请求参数注解
  1. @Path
    该注解用于替换Url的路径(path)部分。

    public interface RequestService {
         
       @GET("/image/{id}") //替换{}内的路径
       Call<ResponseBody> getImage(@Path("id") int id);
    
       @GET("/user/{name}") //替换{}内的路径
       Call<ResponseBody> getUserInfo(@Path("name") String name);
    
       @GET("/user/{name}") //替换{}内的路径,encoded=true则表示自己处理编码,
       Call<ResponseBody> getUserInfo(@Path(value="name", encoded=true) String name);
    
     }

    上述代码有一个是否需要编码的问题,这里举个例子:假如输入名字maple+jaw,默认情况下为GET中的注解为/user/maple%2Bjaw,如果指明自己处理编码,此时输入maple+jaw,路径参数为/user/maple+jaw

  2. @Query
    该注解用于在Url后追加查询参数

    public interface RequestService {
         
       @GET("/list") //追加查询参数后,此时路径为/list?page=xx
       Call<ResponseBody> getList(@Query("page") int page);
    
       @GET("/list") //追加查询参数后,此时路径为/list?page=xx&category=xx
       Call<ResponseBody> getList(@Query("page") int page,@Query("category") String category);
    
       @GET("/list") //同理也可指定是否编码
       Call<ResponseBody> getList(@Query(value="category",encoded=true) String category);
    
     }
  3. @QueryMap
    @QueryMap和@Query的作用是一样的,只不过@QueryMap是以map的形式追加参数,可以一次性追加多个参数

    public interface RequestService {
         
       @GET("/search") 
       Call<ResponseBody> getList(@QueryMap Map<String, String> filters);
    
     }
  4. @Field
    该注解用于添加表单数据,须配合@FormUrlEncoded一起使用。

    public interface RequestService {
         
       @FormUrlEncoded
       @POST("/register") //使用@Field提交表单数据
       Call<ResponseBody> register(@Field("name") String name,@Field("password") String pwd,);
    
       @FormUrlEncoded
       @POST("/register") //使用@Field提交表单数据,encoded=true表示该数据自己编码
       Call<ResponseBody> register(@Field(value="name",encoded=true) String name,@Field("password") String pwd,);
    
     }
  5. @FieldMap
    @Field和@FieldMap的作用一样,后者以map的方式提交表单数据

    public interface RequestService {
         
       @FormUrlEncoded
       @POST("/register") //使用@FieldMap提交表单数据
       Call<ResponseBody> register(@FieldMap Map<String, String> fields);
    
     }
  6. @Header
    该注解用于指明请求头参数,相同名字的请求头是惟一的,新的会直接覆盖旧的。

    public interface RequestService {
         
       @GET("/") 
       Call<ResponseBody> getContent(@Header("Accept-Language") String lang
                                    ,@Header("Cache-Control") String cache);        
    
     }
  7. @Headers
    该注解用于指明请求头参数,和@Header的区别在于不会覆盖掉相同名字的请求参数

    public interface RequestService {
         
       @Headers("Cache-Control: max-age=640000")
       @GET("/") 
       Call<ResponseBody> getContent();   
    
    
       @Headers({
        "Cache-Control: max-age=640000""Accept-Language: gzip, deflate"})
       @GET("/") 
       Call<ResponseBody> getContent();  
    
     }
  8. @HeaderMap
    @HeaderMap和@Headers的作用一样,区别在于以Map的形式指明请求头参数。

    public interface RequestService {
         
       @GET("/search") 
       Call<ResponseBody> getList(@HeaderMap Map<String, String> headers);       
    
     }
  9. @Part
    该注解用于定义分块表单请求中的块。需配合@Multipart一起使用。
    如果类型是MultipartBody.Part,内容将直接被使用。(@Part MultipartBody.Part part
    如果类型是RequestBody,将会和它的contentType一起使用。(@Part("foo") RequestBody foo
    其他类型将会通过转换器转换后使用。(@Part("foo") Image photo
    @Part(XX),XX表示表单名。

      public interface RequestService {
         
       @Multipart
       @POST("/") 
       Call<ResponseBody> example(@Part("des
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
retrofit2是一个用于Android和Java平台的类型安全的HTTP客户端库,它可以用来进行网络请求和数据交互。在retrofit2中,可以使用SSE(Server-Sent Events)来进行服务器推送的实现。 SSE是一种在客户端和服务器之间单向实时通信的技术,它允许服务器发送事件数据到客户端,而客户端则可以监听这些事件并做出相应的处理。在retrofit2中,可以通过定义一个接口来实现SSE的处理,如下所示: ```java public interface SSEService { @GET("/events") Call<ResponseBody> getEvents(); } ``` 在这个例子中,我们定义了一个SSEService接口,其中包含一个用于获取事件数据的GET请求。当调用这个接口时,retrofit2会使用OkHttp来建立连接并监听服务器发送的事件数据。 另外,为了处理服务器发送的事件数据,可以使用retrofit2的Call对象和Callback来实现。例如: ```java SSEService service = retrofit.create(SSEService.class); Call<ResponseBody> call = service.getEvents(); call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { // 处理服务器发送的事件数据 } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { // 处理请求失败的情况 } }); ``` 通过使用retrofit2的SSE功能,可以很方便地实现客户端和服务器之间的实时事件推送和处理。这使得在Android和Java应用中,可以更加灵活和高效地处理服务器推送的事件数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值