9. Retrofit

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

表示发送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);
/**
 * 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
@GET("user")
Call<User> getUser(@Header("Authorization") String Authorization);

// Headers
@Headers("Authorization: authorization")
@GET
Call<User> getUser();

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");

发送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();
上一篇下一篇

猜你喜欢

热点阅读