美文网首页
9. Retrofit

9. Retrofit

作者: 努力生活的西鱼 | 来源:发表于2019-06-24 15:36 被阅读0次

    Retrofit 是一个适用于AndroidJava的类型安全的HTTP客户端

    依赖
    implementation 'com.squareup.retrofit2:retrofit:2.5.0'  // retrofit
    implementation 'com.squareup.retrofit2:converter-gson:2.5.0' // 转换器
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.5.0' // rxJava支持
    implementation 'com.squareup.okhttp3:okhttp:3.12.0' // okhttp
    
    定义一个接口(封装URL地址和数据请求)
    public interface GitHubClient {
    
        @GET("/users/{user}/repos")
        Call<List<GitHubRepo>> reposForUser(@Path("user") String user);
    
    }
    
    实例化Retrofit
    Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("https://api.github.com")
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
    
    通过Retrofit实例创建接口服务对象
    GitHubClient client = retrofit.create(GitHubClient.class);
    
    接口服务对象调用接口中方法,获得Call对象
    Call<List<GitHubRepo>> call = client.reposForUser("WuMeng-1993");
    
    Call对象执行请求(异步,同步请求)
    call.enqueue(new Callback<List<GitHubRepo>>() {
                @Override
                public void onResponse(Call<List<GitHubRepo>> call, Response<List<GitHubRepo>> response) {
                    List<GitHubRepo> repos = response.body();
                    listView.setAdapter(new GitHubRepoAdapter(MainActivity.this,repos));
                }
    
                @Override
                public void onFailure(Call<List<GitHubRepo>> call, Throwable t) {
                    Toast.makeText(MainActivity.this, "error:(", Toast.LENGTH_SHORT).show();
                }
            });
    

    7. 注解类型

    Retrofit
    第一类:网络请求方法
    网络请求方法注解
    • @GET、@POST、@PUT、@DELETE、@HEAD分别对应HTTP中的网络请求方式。

    • @HTTP替换@GET、@POST、@PUT、@DELETE、@HEAD注解的作用以及更多功能的拓展,具体使用:通过method、path、hasBody进行设置

    /**
     * method: 网络请求的方法
     * path: 网络请求地址路径
     * hasBody: 是否有请求体
     * @return
     */
    @HTTP(method = "GET",path = "banner/json/{id}",hasBody = false)
    Call<HomeBannerData> getHomeBannerData1(@Path("id") int id);
    // {id}表示是一个变量
    // method的值retrofit不会做处理,所以要自行保证正确
    
    第二类 标记类
    Retrofit标记类
    • @FormUrlEncoded

    表示发送form-encoded的数据,每个键值对需要用@Field()来注解键名,随后的对象需要提供值,

    /**
    * 表明是一个表单格式的请求(Content-Type:application/x-www-form-urlencoded)
    * @Field("username") 表示将后面的String username的值作为username的值
    * @Field():表单字段
    */
    @POST("user/login")
    @FormUrlEncoded
    Observable<LoginStateBean> userLogin(@Field("username") String username, @Field("password") String password);
    
    • @Multipart
    /**
     * Part 后面支持三种类型,RequestBody,MultipartBody.Part,任意类型。
     * 除MultipartBody.Part之外,其他类型都必须带上表单字段。
     * MultipartBody.Part中已经包含了表单字段的信息
     *
     */
    @POST("/form")
    @Multipart
    Call<ResponseBody> FileUpload(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);
    
    第三类 网络请求参数
    Retrofit网络请求参数
    • @Header & @Headers
    // Header
    @GET("user")
    Call<User> getUser(@Header("Authorization") String Authorization);
    
    // Headers
    @Headers("Authorization: authorization")
    @GET
    Call<User> getUser();
    
    • @Body

    POST方式传递自定义数据类型给服务器。如果提交的是一个Map,那么作用相当于@Field,不过map要经过 FormBody.Builder 类处理成为符合OKHttp格式的表单。

    @POST("users/new")
    Call<User> createUser(@Body User user);
    
    FormBody.Builder builder = new FormBody.Builder();
    builder.add("key","value");
    
    • @Field & @FieldMap

    发送POST请求时,提交请求的表单字段,与FormUrlEncoded 注解配合使用。

    /**
      * 表明是一个表单格式的请求(Content-Type:application/x-www-form-urlencoded)
      * @Field("username") 表示将后面的String username的值作为username的值
      * @param username
      * @param password
      * @Field():表单字段
      */
     @POST("user/login")
     @FormUrlEncoded
     Observable<LoginStateBean> userLogin(@Field("username") String username, @Field("password") String password);
    
    /**
      * 全局搜索
      *
      * @param pageNum
      * @param keywords
      */
     @POST("article/query/{pageNum}/json")
     @FormUrlEncoded
     Observable<ArticleDataRes> getSearchResults(@Path("pageNum") int pageNum, @Field("k") String keywords);
    
    /**
      * Map的key作为表单的键
      */
     @POST("/form")
     @FormUrlEncoded
     Call<ResponseBody> testFormUrlEncoded2(@FieldMap Map<String, Object> map);
    
    @Query和@QueryMap

    用于@GET方法的查询参数(Query = Url中?后面的key-value),如:url = http://www.println.net/?cate=android,其中,Query = cate配置配置时只需要在接口方法中增加一个参数即可。

    @GET("/")    
    Call<String> cate(@Query("cate") String cate);
    
    @GET("article/list/{pageNum}/json")
    Call<ArticleDataRes> getKnowledgeTree(@Path("pageNum") int pageNum, @Query("cid") int cid);
    
    @Get("list/testJson.action")
    Call<User> setUser(@QueryMap HashMap<String,String> user);
    

    @QueryMap 注解会把参数拼接到url后面,所以它适用于GET请求。

    日志拦截器
    // 创建日志拦截器
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    
    // 创建OkHttpClient实例
    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .addInterceptor(interceptor)
            .build();
    
    
    if (BuildConfig.DEBUG) {
    
    }
    
    // 创建Retrofit实例
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://10.0.2.2:3000/api/")
            .addConverterFactory(GsonConverterFactory.create())
            .client(okHttpClient)
            .build();
    

    相关文章

      网友评论

          本文标题:9. Retrofit

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