文档章节

Retrofit2.0 - 网络请求库 注解 详解

Mr_Harlan
 Mr_Harlan
发布于 2017/01/19 10:54
字数 1202
阅读 326
收藏 0

Retrofit - 网络请求库

 

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

OverView

这篇笔记基于Retrofit 1.9。

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

  1. 建立POJO或者Model Class
    服务端返回给客户端的数据一般都是JSON格式,所以可以利用GSON或其他库把JSON直接转换成一个对象。POJO或这个Model Class就是这个对象的类。
  2. 定义REST API Interface
    定义一个Interface,声明我们需要的网络请求方法。
    例如:

    public interface GitHubService {
           @GET("/users/{user}/repos")
           List<Repo> 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<Repo> repos = service.listRepos("octocat");

请求方法

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

  • GET
  • POST
  • PUT
  • DELETE
  • HEAD

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

@GET("/users/list")

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

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

URL处理

  • @Path - 替换参数

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

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

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

请求体

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

@POST("/users/new")
void createUser(@Body User user, Call<User> 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<List<Widget>> call);
@Headers({
    "Accept: application/vnd.github.v3.full+json",
    "User-Agent: Retrofit-Sample-App"
})
@GET("/users/{username}")
void getUser(@Path("username") String username, Call<User>);

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

动态更新HEADER

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

      @GET("/user")
      void getUser(@Header("Authorization") String authorization, Call<User> 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<Repo> listRepos(@Path("user") String user);
  • 异步

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

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

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

处理服务器返回结果

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

          @GET("/users/{user}/repos")
          List<Repo> listRepos(@Path("user") String user);

          @GET("/users/{user}/repos")
          void listRepos(@Path("user") String user, Callback<List<Repo>> 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<Response> call);

参考链接:

  1. 官方文档,不过是Retrofit2.0
  2. 中文文档,这个是Retrofit1.9
  3. http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1109/3662.html
  4. http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0915/3460.html
  5. 源码解析,http://frodoking.github.io/2015/05/16/android-retrofit/

本文转载自:http://www.jianshu.com/p/63723f593695

Mr_Harlan
粉丝 2
博文 21
码字总数 9637
作品 0
烟台
程序员
私信 提问
Retrofit用法详解

一、 简介 Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp做网络请求,其源码详见O...

postdep
2016/11/13
305
0
Aaron/MaterialUi

#MaterialUi ##题外: 构建一个基于material风格的android工具平台。 ##开发环境 androidstudio jdk8 ##主要依赖包介绍 1、网络请求框架:retrofit2.0 2、注解绑定控件:butterknife7.0.1 3、...

Aaron
2017/03/06
0
0
Android Retrofit介绍

一、Retrofit简介 Retrofit是Square公司开发的一个类型安全的Java和Android 的REST客户端库,这个库为网络认证、API请求以及用OkHttp发送网络请求提供了强大的框架 。Retrofit 库使得从web a...

紫韵
2016/03/30
497
4
Retrofit2.0- 源码分析

1. 阅读引导 在分析 Retrofit 源码之前,你首先得理解动态代理模式,因为Retrofit是通过动态代理的方式进行统一网络请求接口类的处理。Retrofit的代码量并不大,只是对OkHttp进行了封装,用更...

负了时光不负卿
2017/12/13
0
0
Okhttp拦截器Interceptor学习和使用

个人博客地址 http://dandanlove.com/ 前言 前年的这个时候我们项目将网络框架替换为 ,然后我对 源码进行了学习和分享,写了几篇相关的文章同时更新了项目的网络框架。 Android网络之Retro...

静默加载
2018/11/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

家庭作业——苗钰婷

2 编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound, Sally shouted, "By the Great Pumpkin, what was that! #include<stdio.h>int main(){......

OSC_Okruuv
26分钟前
5
0
经典系统设计面试题解析:如何设计TinyURL(一)

原文链接: https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
27分钟前
3
0
2.面向对象设计原则(7条)

开闭原则 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 实现方法 可以通过“抽象约束、封装变化”来实...

Eappo_Geng
29分钟前
7
0
8086汇编基础 debug P命令 一步完成loop循环

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
33分钟前
5
0
使用nodeJS实现前端项目自动化之项目构建和文件合并

本文转载于:专业的前端网站➜使用nodeJS实现前端项目自动化之项目构建和文件合并 前面的话   一般地,我们使用构建工具来完成项目的自动化操作。本文主要介绍如何使用nodeJS来实现简单的项...

前端老手
47分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部