Retrofit使用详解

(20) 2024-03-23 10:01:01

介绍

Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的
本文全部是在Retrofit2.0+版本基础上论述

引用

Gradle :
compile 'com.squareup.retrofit:retrofit:2.0.0-beta2'

Maven :
<dependency>
  <groupId>com.squareup.retrofit</groupId>
  <artifactId>retrofit</artifactId>
  <version>2.0.0-beta2</version>
</dependency>

用法demo(get方法)

1.创建业务请求接口,具体代码如下:
public interface InterService {
@GET("query?")
Call<Data> getPhoto(@Query("email") String email,@Query("key") String key);
}
说明:
@GET注解就表示get请求,@Query表示请求参数,将会以key=value的方式拼接在url后面
Data 就是返回数据json封装后的对象
public class Data {
private String reason;
private int error_code;
private Result result;
}

public class Result {
private int status;
private String status_info;
}

2.需要创建一个Retrofit的示例,并完成相应的配置
 Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("http://v.juhe.cn/verifyemail/")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

InterService service = retrofit.create(InterService.class);
说明:
addConverterFactory方法表示需要用什么转换器来解析返回值(json),GsonConverterFactory.create()表示
调用Gson库来解析json返回值

3.调用请求方法,并得到Call实例
Call<Data> call = service.getPhoto("2314800549@qq.com","add4069adb709c1204afb759694c767c");

4.使用Call实例完成同步或异步请求
同步请求:
 //同步请求
    try {
        Data response = call.execute().body();
    } catch (IOException e) {
        e.printStackTrace();
    }
这里需要注意的是网络请求一定要在子线程中完成,不能直接在UI线程执行,不然会crash

异步请求:
//异步请求
call.enqueue(new Callback<Data>() {
        @Override
        public void onResponse(Call<Data> call, Response<Data> response) {
            Toast.makeText(MainActivity.this,response.body().toString(),Toast.LENGTH_LONG).show();
        }
        @Override
        public void onFailure(Call<Data> call, Throwable t) {
            Toast.makeText(MainActivity.this,t.toString(),Toast.LENGTH_LONG).show();

        }
    });
resonpse的body就是data对象

Retrofit使用详解 (https://mushiming.com/)  第1张

retrofit注解

方法注解,包含@GET、@POST、@PUT、@DELETE、@PATH、@HEAD、@OPTIONS、@HTTP。
标记注解,包含@FormUrlEncoded、@Multipart、@Streaming。
参数注解,包含@Query,@QueryMap、@Body、@Field,@FieldMap、@Part,@PartMap。
其他注解,@Path、@Header,@Headers、@Url

@HTTP:可以替代其他方法的任意一种
/**
 * method 表示请的方法,不区分大小写
 * path表示路径
 * hasBody表示是否有请求体
 */
@HTTP(method = "get", path = "users/{user}", hasBody = false)
Call<ResponseBody> getFirstBlog(@Path("user") String user);

@Url:使用全路径复写baseUrl,适用于非统一baseUrl的场景。
@GET
Call<ResponseBody> v3(@Url String url);

@Streaming:用于下载大文件
@Streaming
@GET
Call<ResponseBody> downloadFileWithDynamicUrlAsync(@Url String fileUrl);

@Path:URL占位符,用于替换和动态更新,相应的参数必须使用相同的字符串被@Path进行注释,替换块是{ and }包围的字母
数字组成的字符串
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);

@Query,@QueryMap:查询参数,用于GET查询,需要注意的是@QueryMap可以约定是否需要encode
@GET("group/users")
Call<List<User>> groupList(@Query("id") int groupId);
Call<List<News>> getNews((@QueryMap(encoded=true) Map<String, String> options);

@Body:用于POST请求体,将实例对象根据转换方式转换为对应的json字符串参数,
这个转化方式是GsonConverterFactory定义的。
 @POST("add")
 Call<List<User>> addUser(@Body User user);

@Field,@FieldMap:Post方式传递简单的键值对,
需要添加@FormUrlEncoded表示表单提交
Content-Type:application/x-www-form-urlencoded
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);

@Part,@PartMap:用于POST文件上传
其中@Part MultipartBody.Part代表文件,@Part("key") RequestBody代表参数
需要添加@Multipart表示支持文件上传的表单,Content-Type: multipart/form-data

@Header:header处理,不能被互相覆盖,用于修饰参数,
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)

@Headers 用于修饰方法,用于设置多个Header值:
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);

自定义转换器

如果需要使用Retrofit不支持开箱即用的内容格式(如YAML、txt、自定义格式)和API进行通信,或者想要使用不同的库实
现已经存在的格式,你可以很方便的创建自己的转换器。创建方式:新建一个类继承Converter.Factory类,并在构建Retrofit
实例时传入转换器实例。
THE END

发表回复