Rxjava+Retrofit+Gson组合框架的使用(一)

Retrofit
1.Retrofit的简单示例

首先介绍Retrofit,这个是square公司的产品,它说白了就是对okhttp的封装,它可以将HTTP API通过注解式编程来转换为JAVA的接口,比如:

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

 
解释一下,首先这个就是创建的一个GET请求,通过@GET的形式来创建,同理,还有POST、HEAD 、 PUT 、 DELETE 、 TRACE 、 CONNECT 、 OPTIONS的等。括号里面的是你的相对路径,{user}这个是被下面的@path中的内容替换的部分,@path用来替换服务器地址中用“{}”包裹起来的内容。后面的String user就是你的替换内容,{user}就类似与一个占位符。但是要注意,@path不能替换服务器名称以外的URL路径,举个例子: 

下面是一个完整的 URL (一个完整的 URL 包括模式(或称协议)、服务器名称(或 IP 地址)、路径)
http://www.hitomis.com/user.do?action=findUser&username="zuck"
@Path  只能替换 http://www.hitomis.com/user.do 服务器名称中的内容,而并不能替换 action=findUser&username="zuck" 路径中的内容

 
 
 
然后你可以创建一个Retrofit对象,通过生成刚才的GithubService接口实例来创建 

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com/")
    .build();
// Create an instance of our GitHub API interface.
GitHubService service = retrofit.create(GitHubService.class);
而每一个通过GithubService创建的命令都会产生一个同步或异步的request给远程服务器

// Create a call instance for looking up Retrofit contributors.
Call<List<Contributor>> call = github.contributors("square", "retrofit");
然后通过这个命令去获得数据

// Fetch and print a list of the contributors to the library.
call.enqueue(new Callback<List<Contributor>>() {
	
	@Override
	public void onResponse(Response<List<Contributor>> response) {
		for (Contributor contributor : response.body()) {
			System.out.println(contributor.login + " (" + contributor.contributions + ")");
		}
	}
	@Override
	public void onFailure(Throwable t) {
	
	}
});

enqueue是异步发送请求,你可以使用execute来实现同步发送,但是基于android本身而言,异步更符合需求。


2.Retrofit的官方文档
Retrofit的四个接口:
    Callback<T> :用以处理网络请求的返回数据接口,内部有两个方法,分别是onResponse和onFailure,和volley很相似
    Call<T> : 这个接口主要是用来发送你的网络请求,该接口的默认实现是okHttpCall<T>,你也可以自己扩展这个Call<T>
    CallAdapter<T> : 用以将Call<T>对象转换为其他对象,默认实现是DefaultAdapter
    Converter<F,T> : 用以将网络请求返回回来的数据解析为你需要的对象,比如xml,json,protocol buffer等


Retrofit的API声明
1. 请求方法(request method)
    
    每个方法都必须包含HTTP注解,提供请求方式和相对URL。
    五种注解:GET、POST、DELETE、PUT、HEAD
    相对URL用以对注解阐述,例如:

@GET("users/list")

 

    你也可以在URL中指定一个查找参数

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

 
2.URL操作
    一个请求URL可以通过替代块和实际参数在方法中动态更新,替代块是由{}包裹起来的一传由数字和字母组成的string,而对应参数必须是完全一致的string并且放在@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);


3.请求体(Request body)
    一个对象可以通过@Body注解来被指定该请求的请求体
@POST("users/new")
Call<User> createUser(@Body User user);
该对象会被Retrofit实例指定的转换器转换,如果没有指定转换器,那么默认使用RequestBody

4.FORM ENCODED AND MULTIPART
    当使用@FormURLEncoded注解时,可以发送表单数据。表单数据由键值对构成,每个键值对必须由@Field注解开头,包含名称和对象,由对象提供值
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
 

    多部请求可以通过@Multipart来实现,每个部分由@Part注解来声明,每个部分都可以使用Retrofit的转换器或者自己去实现RequestBody来操作自己想要的序列化

@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);

 
 5.请求头的相关操作
    你可以使用@Headers注解来设置一个静态的请求头
@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();
@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提供匹配的参数,如果这个值为null,那么头部会缺失。另外,toString会被作用于你传的值,并且会产生相应的结果
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)
 
    当包含多个头部时,需要给每个请求都添加一个指定的okhttp拦截器
6.同步和异步
    Call<T>的实例可以被同步或异步执行,每个实例只能执行一次,但是可以通过clone()方法来创建一个新的实例
    在Android中回调被执行在main Thread,而在JVM中,回调被执行于HTTP请求相同的线程中
7.转换器
    默认情况下Retrofit使用okhttp的中定义的ResponseBody类型来转换返回体,并且@Body注解后只接受RequestBody类型的请求体
    这里提供了七种最流行的序列化库,用以转换你需要的数据
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

 使用范例:
Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("https://api.github.com")
    .addConverterFactory(GsonConverterFactory.create())
    .build();

GitHubService service = retrofit.create(GitHubService.class);
 
 如果以上没有你需要的数据类型,你也可以自定义你需要的转换器,只需要创建一个类继承Converter.Factory并在构建适配器时传入一个实例即可。 
下载
maven
<dependency>
  <groupId>com.squareup.retrofit2</groupId>
  <artifactId>retrofit</artifactId>
  <version>2.1.0</version>
</dependency>
 
 gradle 
compile 'com.squareup.retrofit2:retrofit:2.1.0'
 
 Retrofit最低支持JAVA 7、android2.3 
配置混淆
<pre class="prettyprint" style="padding: 9.5px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 13px; color: rgb(102, 102, 102); border-radius: 4px; margin-top: 0px; margin-bottom: 20px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre-wrap; border: 1px solid rgba(0, 0, 0, 0.14902); background-color: rgb(245, 245, 245);"># Platform calls Class.forName on types which do not exist on Android to determine platform.
-dontnote retrofit2.Platform
# Platform used when running on RoboVM on iOS. Will not be used at runtime.
-dontnote retrofit2.Platform$IOS$MainThreadExecutor
# Platform used when running on Java 8 VMs. Will not be used at runtime.
-dontwarn retrofit2.Platform$Java8
# Retain generic type information for use by reflection by converters and adapters.
-keepattributes Signature
# Retain declared checked exceptions for use by a Proxy instance.
-keepattributes Exceptions













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值