Retrofit使用相关介绍

Retrofit简介

  • Retrofit是基于RESTful的HTTP网络请求框架的封装,其工作本质是OKHttp完成,在服务端返回数据之后,OkHttp将原始的结果交给Retrofit进行解析
  • 代码简洁,易与其他框架联合使用,性能和处理都比较理想
  • 高度封装导致扩展性差,若服务器不能给出统一的API的形式,将很难进行处理

Retrofit使用步骤

  • 添加Retrofit库依赖
  • 创建接收服务器返回数据的实体类(或者直接使用ResponseBody)
  • 创建描述网络请求的接口
  • 创建Retrofit实例
  • 创建网络请求接口的实例,配置请求参数
  • 发出请求
1、添加Retrofit库依赖
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
2、创建接收服务器返回数据的实体类
//可以直接使用ResponseBody,但是获取返回的json字符串的写法是“response.body().string()”
public class RetorfitModel{
    private int status;
    private content content;
    private static class content {
        private String from;
        private String to;
        private String vendor;
        private String out;
        private int errNo;
   }
}
3、创建描述网络请求的接口
public interface AppInterService {
    @GET("interface/user")
    Call<ResponseBody> loginRequest(@QueryMap Map<String,String> params);
}
4、创建Retrofit实例
 Retrofit retrofit = new Retrofit.Builder()
           .baseUrl("https://zsk.testurl.com/")
           .addConverterFactory(GsonConverterFactory.create())
           .client(okHttpClient)
           .build();
5、创建网络请求接口的实例,配置请求参数
AppInterService interService = retrofit.create(AppInterService.class);
//多个请求参数可使用Map
Map<String,String> requestMap = new HashMap<>();
requestMap.put("param1",param1);
requestMap.put("param2",param2);
requestMap.put("param3",param3);
requestMap.put("param4",param4);
//传入请求参数
Call<ResponseBody> call = interService.loginRequest(requestMap);
6、发出请求(execute:同步执行,enqueue异步执行)
call.enqueue(new Callback<ResponseBody>() {
       @Override
       public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
           try {
               //注意此处的是string()不是toString()
               String json = response.body().string();
               //......
           } catch (Exception e) {
               e.printStackTrace();
           }
       }

       @Override
       public void onFailure(Call<ResponseBody> call, Throwable t) {

       }
   });

Retrofit注解介绍

这里写图片描述

网络请求方法注解

我们知道HTTP请求方法包含get、post、delete、put、head、patch、trace、options总共8种。除get外,其他6种都是基于post方法衍生的,最常见的是get和post,而put、delete、post、get这四种最重要,分别对应数据库的增删改查。而Retrofit同样支持八种HTTP请求方法注解,分别是:GET,POST,PUT,DELETE,HEAD,PATCH,OPTIONS,HTTP,其中前7种分别对应HTTP请求方法,而HTTP注解可自定义请求方法,也就是说可以替换前面七种方法

1、HTTP请求方法:
这里写图片描述
2、Retrofit请求方法注解:
@GET : 对应HTTP的get请求方法

 @GET("interface/user")
 Call<ResponseBody> getUser();

@POST: 对应HTTP的post请求方法

 @POST("interface/user")
 Call<ResponseBody> addUser();

@PUT: 对应HTTP的put请求方法

 @PUT("interface/user")
 Call<ResponseBody> updateUser();

@DELETE: 对应HTTP的delete请求方法

 @DELETE("interface/user")
 Call<ResponseBody> deleteUser();

HEAD:对应HTTP的head请求方法

PATCH:对应HTTP的patch请求方法

OPTIONS:对应HTTP的options请求方法

HTTP:可替换以上七种,也可以扩展请求方法

/**
* method 表示请的方法,不区分大小写
* path表示路径
* hasBody表示是否有请求体
*/
@HTTP(method = "get", path = "public", hasBody = false)
Call<BaseResult<List<User>>> getUser();
标记类注解

@FormUrlEncoded: 指请求体是一个Form表单,需要和参数类注解@Field,@FieldMap搭配使用

@FormUrlEncoded
@POST("interface/user")
Call<ResponseBody> addUser(@Field("userName") String userName);

@Multipart: 指请求体是一个支持文件上传的Form表单,需要和参数类注解@Part,@PartMap搭配使用

@Multipart
@POST("interface/user")
Call<ResponseBody> uploadFile(@Part MultipartBody.Part file);

@Streaming: 指响应体的数据以流的形式返回,如果不使用默认会把数据全部加载到内存,所以下载文件时需要加上这个注解

@Streaming
@GET("interface/download")
Call<ResponseBody> downloadFile();
网络请求参数注解

@Header / @Headers: 添加请求头,其内容多为实现缓存、认证、平台(Android or iOS)、app版本、操作系统版本、网络类型等信息。注意@Header 用于动态添加请求头,@Headers用于静态添加请求头

 // 静态添加
 @Headers({
            "key1:value1",
            "key2:value2"
            })
 @GET("interface_2/test")
 Call<ResponseBody> getHeaderRequest(@QueryMap Map<String,String> params);

//动态添加
 @GET("interface_2/test")
 Call<ResponseBody> getHeaderRequest(@Header("Token") String token);

@Url: 用于动态的改变Url,当设置Url的时候回替换@GET(“…”)中的内容,故可有写法如下:

@GET
Call<ResponseBody> getUser(@Url String url);

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

/**
  Map
*/
FormBody.Builder builder = new FormBody.Builder();
builder.add("key","value");

//以自定义的数据类型作为参数
@POST("user")
Call<BaseResult<String>> addUser(@Body User user);

@Path: 用于动态的改变URL的值

/**
  1、发起请求的时候参数“user”的值会替换@GET中{user}的值
  2、@Url@path有相同的意义
*/
@GET("users/{user}/repos")
Call<ResponseBody>  getUserResult(@Path("user") String user );

@Field / @FieldMap: Post方式发送请求时提交请求的表单字段和@FormUrlEncoded配合使用

 //@Field 
 @FormUrlEncoded
 @POST("user")
 Call<ResponseBody> addUser(@Field("userName") String userName);

 //@FieldMap
 @FormUrlEncoded
 @POST("user")
 Call<ResponseBody> addUsers(@FieldMap Map<String,String> fieldMap);

@Part / @PartMap: Post方式发送请求时提交请求的表单字段和@Multipart 配合使用,与@Field的区别:功能相同,但携带的参数类型更加丰富,包括数据流,所以适用于 有文件上传 的场景

 // @Part 
 @Multipart
 @POST("interface_2/lic_continue-upload_pic")
 Call<ResponseBody> upLoadPicute(@QueryMap Map<String,String> params, 
     @Part MultipartBody.Part file);

 // @PartMap
 @POST("interface_2/lic_continue-upload_pics")
 @Multipart
 Call<ResponseBody> testFileUpload2(@PartMap Map<String, RequestBody> args,
     @Part MultipartBody.Part file);

@Query / @QueryMap: 用于 @GET 方法的查询参数,拼接在Url之后

 // @Query 单个参数
 @GET("interface_2/user-check_code")
 Call<ResponseBody> loginRequest(@Query("name") param);

// @QueryMap  多个参数
 @GET("interface_2/lic_continue-con_statistics")
 Call<ResponseBody> getAchievementRequest(@QueryMap Map<String,String> params);

Retrofit上传图片实例

1、创建描述网络请求的接口
public interface AppInterService {
  @Multipart
  @POST("interface_2/lic_continue-upload_pic")
  Call<ResponseBody> upLoadPicute(@QueryMap Map<String,String> params,
    @Part MultipartBody.Part file);
}
2、创建Retrofit请求,处理响应
private void upLoadByRetrofit(String filePath, String idcardType) {
 Retrofit retrofit = new Retrofit.Builder()
           .baseUrl("https://zsk.testurl.com/")
           .addConverterFactory(GsonConverterFactory.create())
           .client(okHttpClient)
           .build();
 AppInterService interService = retrofit.create(AppInterService.class);
 HashMap<String,String> params = new HashMap<>();
 params = getParams("设置自己的参数");
 File file = new File(filePath);
 RequestBody imageBody = RequestBody.create(MediaType.parse("multipart/form-data"),file);
 MultipartBody.Part part = MultipartBody.Part.createFormData("file",file.getName(),imageBody);
 //设置参数和图片
 Call<ResponseBody> call = interService.upLoadPicute(params,part);
 call.enqueue(new Callback<ResponseBody>() {
   @Override
   public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response)   
   {
      try {
           String json = response.body().string()
       } catch (IOException e) {
           e.printStackTrace();
       }
   @Override
   public void onFailure(Call<ResponseBody> call, Throwable t) {

    }
   });
}

猜你喜欢

转载自blog.csdn.net/qq_33768280/article/details/80534701