Retrofit 一个适用于Android和Java的类型安全的HTTP客户端

其实我就是照着这里手敲了一遍——http://blog.qiji.tech/archives/10227?utm_source=tuicool&utm_medium=referral



但毕竟这是我的第一篇博客,我的手为什么在颤抖...


简介

Retrofit 将你的 HTTP API 转换成一个 Java 接口
public interface GitHubService{
 @GET("users/{user}/repos")
 Call<List<Repo>> listRepos(@Path("user") String user);
}


可以通过retrofit类来生成一个GitHubService接口(你定义的接口)的实现

etrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();
GitHubService service = retrofit.create(GitHubService.class);


从已创建的GitHubService所得到的的每一个Call对象,都能产生同步或异步的HTTP请求到远程服务器

Call<List<Repo>> repos=service.listRepos("octocat");


使用注解来描述HTTP请求:
-URL参数替换与请求参数支持
-请求体类型转换(如JSON,协议缓存)
-多请求体与文件上传

注意:本文仍旧用来说明2.0APIs

API说明
接口方法的注解以及参数决定了一个请求将被怎样处理

请求方法
每一个方法必须有一个HTTP注解来提供请求方式和相对路径.五种内置的注解是:GET.POST.PUT.DELETE.HEAD.资源的相对路径也要在注解中指定
@GET("users/list")


你也可以在路径中指定查询参数

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


URL操作
请求路径可以通过使用可替代块和方法中的参数来动态指定.可替代块是一个被{}包裹的由字母和数字组成的字符串.对应的参数必须用带相同字符串的@Path注释
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);

查询参数也能被添加
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId,@Query("sort") String sort);

也可以使用Map来组成复合查询参数
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId,@QueryMap Map<String,String> options);

请求体
可以使用一个带@Body 注解的对象来制定HTTP请求体
@POST("users/new")
Call<User> createUser(@Body User user);

这个对象将会被Retrofit实例中指定的converter转换.如果没有指定converter,那么将会默认使用RequestBody.

FORM ENCODED 和 MULTIPART
方法也可以声明已发送form-encoded和multipart数据.
在方法前使用 @FormUrlEncoded  才可以发送Form-encoded数据.使用包含name的@Field注解和提供value的对象来组成键值对.
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first,@Field("last_name") String last);
如果你用post请求进行提交数据(比如用户注册、登陆等表单类请求),参数类型一定要用准确,是Field,如果选择了Query,而调试过程没有发现这个问题,相信我你会发疯的。.... @FormUrlEncoded必须带上,防止出现乱码。

同样,在方法前指定@Multipart注解才能发送Multipart参数.使用@Part注解来声明每个部分.
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBodyphoto,@Part("description")RequestBodydescription);

多个Multipart部分需要使用Retrofit的其中一种转换器或者自行声明RequestBody来处理其序列化.

HEADER 操作
使用@Headers注解为方法设置静态请求头
@Headers("Cache-Control:max-age=640000")
@GET("widget/list")
Call<List<Widget>> wifgetList();

@Headers({
  "Accept: application/vnd.github.v3.full+json",
  "User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);

注意请求头参数并不会彼此覆盖.具有相同名字的所有请求头都会被添加至请求.
也可以使用@Header注解来动态添加请求头.对应的参数必须提供给@Header.如果值为空那么该请求头参数将会被忽略.否则,将会使用参数调用toString方法后的结果.
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)

可以使用OkHttp intercaptor来制定每个需要添加请求头的请求(这个很常用)

同步 VS 异步
Call的实例既可以同步执行也可以异步执行.每一个实例只能使用一种执行方式,但是调用clone()方法将会创建一个新的可用实例.
在Android中,回调函数将会在主线程中执行.而在JVM中,回调函数将会在执行HTTP请求的相同线程发生.

Retrofit 配置
Retrofit类可以通过你的API接口转换成一个可回调的对象.默认情况下,Retrofit会返回一个合理的默认值,但它允许你进行自定义操作.

CONVERTERS
默认情况下,Retrofit只能讲HTTP请求体反序列化为OkHttp的ResponseBody类型,且只能接受RequestBody类型作为@Body.
可以通过添加转换器(converters)来支持其他类型,以下六个同级模块采用了常用的序列化库,可以很方便的使用.
  • Gson: com.squareup.retrofit2:converter-gson
  • Jackson: com.squareup.retrofit2:converter-jackson
  • Moshi: com.squareup.retrofit2:converter-moshi
  • Protobuf: com.squareup.retrofit2:converter-protobuf
  • Wire: com.squareup.retrofit2:converter-wire
  • Simple XML: com.squareup.retrofit2:converter-simplexml
  • Scalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars
请看一个使用GsonConverterFactory类生成GitHubService的接口实现gson反序列化的例子.

Retrofit retrofit=new Retrofit.Builder()
        .baseUrl("https://api.github.com")
        .addConverterFactory(GsonConverFactory.create())
        .build();
GitHutService service=retrofit.create(GitHubService.class);













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值