博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Retrofit2.0 - 网络请求库 注解 详解
阅读量:6539 次
发布时间:2019-06-24

本文共 4177 字,大约阅读时间需要 13 分钟。

hot3.png

Retrofit - 网络请求库

 

Retrofit基于注解和动态代理,优化了Android中的网络请求操作。

OverView

这篇笔记基于Retrofit 1.9。

19105443_jXYF.png

从上图可见,对Retrofit的使用可以分成三部分:

  1. 建立POJO或者Model Class
    服务端返回给客户端的数据一般都是JSON格式,所以可以利用GSON或其他库把JSON直接转换成一个对象。POJO或这个Model Class就是这个对象的类。
  2. 定义REST API Interface

    定义一个Interface,声明我们需要的网络请求方法。
    例如:

    public interface GitHubService {       @GET("/users/{user}/repos")       List
    listRepos(@Path("user") String user);}

    Repo,就是第一步中定义的POJO或者Model Class。Retrofit框架会自动把服务端返回的JSON数据,转换成Repo。Retrofit默认采用GSON库。

  3. RestAdapter

    RestAdapter用来配置网络请求的参数,并且生成一个接口的实现。
    配置请求参数:

    RestAdapter restAdapter = new RestAdapter.Builder()             .setEndpoint("https://api.github.com")             .setClient(new OkClient(new OkHttpClient()))             .build();

    生成接口的实现:

    GitHubService service = restAdapter.create(GitHubService.class);

以上三步完成后,调用接口函数完成与服务器的交互:

List
repos = service.listRepos("octocat");

请求方法

Retrofit框架提供了很多注解,其中HTTP注解有五个,用来修饰请求方法(还可以顺便处理URL路径):

  • GET
  • POST
  • PUT
  • DELETE
  • HEAD

这五个注解正好涵盖了数据的增删改查方法,符合REST标准。每一个请求方法都必须要由这五个注解中的一个修饰。

@GET("/users/list")

可以在注解中添加查询参数

@GET("/users/list?sort=desc")

URL处理

  • - 替换参数

    @GET("/group/{id}/users")  List
    groupList(@Path("id") int groupId);
  • - 添加查询参数

    @GET("/group/{id}/users")  List
    groupList(@Path("id") int groupId, @Query("sort") String sort);
  • @QueryMap - 如果有多个查询参数,把它们放在Map中

    @GET("/group/{id}/users")  List
    groupList(@Path("id") int groupId, @QueryMap Map
    options);

请求体

请求体(RequestBody),一般用于POST方法传递请求参数。

@POST("/users/new")void createUser(@Body User user, Call
call);

参数会被指定的转换器转换成字符串或字节流提交到服务器,如果没有指定转换器,Retrofit将会默认使用RequestBody

FORM ENCODED(表单) And MULTIPART

  • FORM ENCODED

    使用 @FormUrlEncoded 修饰请求方法,可以把表单数据提交到服务端。

    用 @Field 修饰key-value对。

    @FormUrlEncoded  @POST("/user/edit")  User updateUser(@Field("first_name") String first, @Field("last_name") String last);
  • MULTIPART

    使用 @Multipart 修饰请求方法,@Part 修饰每一个Part

    @Multipart  @PUT("/user/photo")  User updateUser(@Part("photo") TypedFile photo, @Part("description") TypedString description);

    Multipart 中的Part使用 RestAdapter 的转换器来转换,也可以实现 TypedOutput 自己处理序列化。

    Multipart主要用来上传文件吗?如果是,具体操作又是如何? 

配制HEADER

用 @Headers 设置Http请求的header。

@Headers("Cache-Control: max-age=640000")@GET("/widget/list")void widgetList(Call
> call);
@Headers({    "Accept: application/vnd.github.v3.full+json",    "User-Agent: Retrofit-Sample-App"})@GET("/users/{username}")void getUser(@Path("username") String username, Call
);

Http请求头不会互相覆盖,如果存在多个请求头的名字相同,那么它们全部都会被包含在Http请求中。

动态更新HEADER

  • 在请求方法的参数中,用 @Header 动态更新Http请求头

    @GET("/user")  void getUser(@Header("Authorization") String authorization, Call
    call)

    参数不能为null,否则这个header将会被删掉。

  • 在RestAdapter中,利用RequestInterceptor动态更新Header

    RequestInterceptor requestInterceptor = new RequestInterceptor() {  @Override  public void intercept(RequestFacade request) {      request.addHeader("User-Agent", "Retrofit-Sample-App");  }};RestAdapter restAdapter = new RestAdapter.Builder()  .setEndpoint("https://api.github.com")  .setRequestInterceptor(requestInterceptor)  .build();

异步与同步

每个请求方法都可以定义成同步或者异步。

  • 同步

    同步方法有返回值,且参数中不包含回调

    @GET("/users/{user}/repos")    List
    listRepos(@Path("user") String user);
  • 异步

    异步方法没有返回值,且最后一个参数须是Callback对象

    @GET("/users/{user}/repos")    void listRepos(@Path("user") String user, Callback
    > call);

    在Android中,callbacks将会在主线程中调用。在普通Java程序中,callbacks将会在执行HTTP请求方法的那个线程中调用。

处理服务器返回结果

RestAdapter中的转换器会把服务器的返回结果(一般为JSON)转换成我们在函数返回值或Callback接口中定义的Java对象。

@GET("/users/{user}/repos")          List
listRepos(@Path("user") String user); @GET("/users/{user}/repos") void listRepos(@Path("user") String user, Callback
> call);

List<Repo>,就是将要被转换成的Java对象。

直接获取返回体

如果要直接获取服务器返回的HTTP返回体,在返回值或callback中直接使用 Response对象。

@GET("/users/{user}/repos")          Response listRepos(@Path("user") String user);          @GET("/users/{user}/repos")          void listRepos(@Path("user") String user, Callback
call);

参考链接:

  1. ,不过是Retrofit2.0
  2. ,这个是Retrofit1.9
  3. 源码解析,

转载于:https://my.oschina.net/zhushihui/blog/827657

你可能感兴趣的文章
input文本框实现宽度自适应代码实例
查看>>
C#基本数据类型 <思维导图>
查看>>
POJ3321 Apple Tree (树状数组)
查看>>
protocol buffers的编码原理
查看>>
行为型设计模式之命令模式(Command)
查看>>
减少死锁的几个常用方法
查看>>
HDFS 核心原理
查看>>
正确配置jstl的maven依赖,jar包冲突的问题终于解决啦
查看>>
利用KMP算法解决串的模式匹配问题(c++) -- 数据结构
查看>>
登录内网账号后,连接不上内网网址
查看>>
安装 MariaDB
查看>>
【deep learning学习笔记】注释yusugomori的DA代码 --- dA.h
查看>>
Ubuntu 12.04 root用户登录设置
查看>>
windows核心编程-互斥器(Mutexes)
查看>>
纯手工打造漂亮的垂直时间轴,使用最简单的HTML+CSS+JQUERY完成100个版本更新记录的华丽转身!...
查看>>
java 为啥变量名前要加个m?
查看>>
探索Android中的Parcel机制(上)
查看>>
c++ 类型定义
查看>>
C#开发微信门户及应用(5)--用户分组信息管理
查看>>
怎样实现前端裁剪上传图片功能
查看>>