android&java 使用Retrofit

作者: 梵依然 | 来源:发表于2016-11-23 23:52 被阅读290次

    介绍

    Retrofit把HTTP API改造成java接口.

    public interface GitHubService {
      @GET("users/{user}/repos")
      Call<List<Repo>> listRepos(@Path("user") String user);
    }
    

    使用Retrofit类生成一个GitHubService接口的实现。

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com/")
        .build();
    
    GitHubService service = retrofit.create(GitHubService.class);
    

    生成的GitHubService的每个Call会向远端服务器生成一个同步的或异步的Http请求。

    Call<List<Repo>> repos = service.listRepos("octocat");
    

    使用注解来描述HTTP请求:
    *URL参数替换和查询参数支持;
    *请求主体的对象转换;
    *多个请求主体和文件上传。

    API声明

    接口中方法的注解和它的参数指定请求怎么被处理。

    请求方法

    每个方法必须有提供请求方法和相对URL的HTTP注解。有五种注解:GET,POST,PUT,DELETE,和HEAD。资源的相对URL要在注解中指定。

    @GET("users/list")
    

    也可以在URL中指定请求参数

    @GET("users/list?sort=desc")
    
    URL控制

    请求URL可以使用替换块和方法的参数动态的更新。替换块是使用{}包含的字母数字的字符串。相应的参数必须使用@Path来标示相同的字符串。

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

    请求参数也可以添加。

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

    对于更复杂的参数组合可以使用Map代替。

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

    使用@Body注解来标示一个HTTP请求体。

    @POST("users/new")
    Call<User> createUser(@Body User user);
    
    表格编码和多参数

    当在方法前添加@FormUrlEncoded注解的时候表示以表格编码的方式发送数据。每个键值对使用@Field包含的名字和提供值的对象来表示。

    @FormUrlEncoded
    @POST("user/edit")
    Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
    

    多参数请求使用@Multipart。Parts使用@Part注解声明。

    @Multipart
    @PUT("user/photo")
    Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
    
    Header操作

    方法可以通过@Header注解使用静态的header

    @Headers("Cache-Control: max-age=640000")
    @GET("widget/list")
    Call<List<Widget>> widgetList();
    
    @Headers({
        "Accept: application/vnd.github.v3.full+json",
        "User-Agent: Retrofit-Sample-App"
    })
    @GET("users/{username}")
    Call<User> getUser(@Path("username") String username);
    

    注意headers不会被彼此覆盖。所有相同名字的的headers会被包含在请求中。
    一个请求Header可以使用@Header注解动态的更新。相应的参数必须使用@Header提供。如果值为null,header会被忽略。否则,值的toString的结果会被使用。

    @GET("user")
    Call<User> getUser(@Header("Authorization") String authorization)
    
    同步VS异步

    Call实例可以同步执行也可以异步执行。每个实例智能执行一次,但是调用clone()会创建一个新的实例来使用。
    在Android,回调会在主线程中被执行。在JVM,回调会在执行HTTP请求的线程中执行。

    Retrofit 配置

    转换器

    Retrofit是通过你的API接口转换为回调对象的类。默认情况下,Retrofit会有默认理智的配置,但是也允许自定义。
    默认情况下,Retrofit只能反序列化HTTP body为OkHttp的ResponseBody类型而且只能接受RequestBody类型的@Body。
    转换器可以添加来支持其他类型。为了方便提供了六个模块来适应流行的序列化库。
    *Gson: com.squareup.retrofit2:converter-goon
    *Jackson: com.squareup.retrofit2:converter-jackson
    *Moshi: com.squareup.retrofit2:converter-mosh
    *Protobuf: com.squareup.retrofit2:converter-protobuf
    *Wire: com.squareup.retrofit2:converter-wire
    *Simple XML: com.squareup.retrofit2:converter-simplexml
    *Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars
    这有一个使用GsonConverterFactory类来生成GitHubService接口的实现,当然是使用Gson来反序列号。

    Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("https://api.github.com")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
    
    GitHubService service = retrofit.create(GitHubService.class);
    
    自定义转换器

    如果api使用的是Retrofit不支持的内容格式(比如YAML,txt,自定义格式)或者希望使用不同的库来实现已经存在的格式,可以创建需要的转换器。创建一个继承自Converter.Factory的类,然后在创建适配器的时候传入到实例中。

    相关文章

      网友评论

        本文标题:android&java 使用Retrofit

        本文链接:https://www.haomeiwen.com/subject/veovpttx.html