9. Retrofit
2019-06-24 本文已影响0人
努力生活的西鱼
Retrofit
是一个适用于Android
和Java
的类型安全的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();