标签:
网络访问基于rxjava+retrofit2+okhttp进行封装,因此,要求使用者熟悉使用rxjava基本功能,相关学习文档:http://blog.csdn.net/meegomeego/article/details/49155989/。
retrofit2中http请求方便注解包括:GET, POST, PUT, DELETE, HEAD,对应于restful服务器接口相关请求方法,一般情况下我们只会使用到GET, POST, PUT, DELETE这四个方法。另外,针对http协议的header,url,body还有对应的注解,官方说明文档:http://square.github.io/retrofit/。
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
我们想在url中,动态的传输请求参数时,可以以{param}的格式编写,并使用@Path(“param”)在函数对应参数变量上进行注解即可,例如上面的例子groupId的值为10,那么实际请求的url地址为:group/10/users
@GET("users/list")
Call<List<User>> groupList(@Query("sort") String sort);
还有另外一种比较常用的方式为在请求地址后面加?,然后以key=value的形式进行传参,例如我们想给服务器传输一个变量名为sort,变量值为desc的参数,我们可以按照上面的方式进行书写注解.这样实际请求的url为:users/list?sort=desc。
-@QueryMap
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
@Query的方式,只能满足我们传输一个参数,当我们要使用这种格式传输一组参数时,我们可以使用 @QueryMap。
@POST("users/new")
Call<User> createUser(@Body User user);
在方法形参中加入@Body注解,就可以表明该对象为请求的body参数,retrofit2会根据你配置的ConverterFactory进行对应的序列化,例如配置JacksonConverterFactory,那么请求body会被序列化为json格式。
另外retrofit2还支持表单提交方式等等,目前服务器统一使用json进行数据通信,这里就不讨论了。
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);
@Headers可以给http请求添加固定的header请求信息,如果想给每个请求都添加header固定信息,最好在okhttp的拦截器中进行统一处理,避免给每个网络接口添加该类信息,显得冗余。
由于业务服务器需要传输固定的请求header,以及要求进行签名等,因此针对这部分功能进行了封装。
WatchHttpCreater.init(new WatchDevice(context), new LauncherAppInfo(context), null);
该函数需在application的onCreate方法中调用,只需要初始化一次即可,重复初始化将抛出RuntimeException,这里初始化的目的,主要是拦截器中,针对服务器特有的签名和参数要求,需要对这类数据进行处理。
public interface RsaHttp {
/**
* 获取rsa公钥
* @return
*/
@GET("/rsa")
Observable<BaseResult<Map<String, String>>> getRsaPublicKey();
}
BaseResult该类为服务器返回的固定对象,由于BaseResult中的data对象存在不同类型,为了便于底层统一进行json解析,需要声明data的类型,例如该接口返回的data数据为Map<String, String>
类型,因此返回数据声明为BaseResult<Map<String, String>>
。
Observable<BaseResult<Map<String, String>>> observable = WatchHttpCreater.create(BaseUrlManager.getDefaultUrl(), RsaHttp.class).getRsaPublicKey();
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<BaseResult<Map<String, String>>>() {
@Override
public void call(BaseResult<Map<String, String>> mapBaseResult) {
System.out.println(mapBaseResult.getData().get("publicKey"));
}
});
用到时,再完善……
标签:
原文地址:http://www.cnblogs.com/zhoujunhua/p/5315879.html