网络访问使用说明
网络访问使用说明
网络访问基于rxjava+retrofit2+okhttp进行封装,因此,要求使用者熟悉使用rxjava基本功能,相关学习文档:http://blog.csdn.net/meegomeego/article/details/49155989/。
1. retrofit2注解使用简单说明
retrofit2中http请求方便注解包括:GET, POST, PUT, DELETE, HEAD,对应于restful服务器接口相关请求方法,一般情况下我们只会使用到GET, POST, PUT, DELETE这四个方法。另外,针对http协议的header,url,body还有对应的注解,官方说明文档:http://square.github.io/retrofit/。
1.1.url相关注解
- @Path说明
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
我们想在url中,动态的传输请求参数时,可以以{param}的格式编写,并使用@Path(“param”)在函数对应参数变量上进行注解即可,例如上面的例子groupId的值为10,那么实际请求的url地址为:group/10/users
- @Query说明
@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。
1.2.body相关注解
@POST("users/new")
Call<User> createUser(@Body User user);
在方法形参中加入@Body注解,就可以表明该对象为请求的body参数,retrofit2会根据你配置的ConverterFactory进行对应的序列化,例如配置JacksonConverterFactory,那么请求body会被序列化为json格式。
另外retrofit2还支持表单提交方式等等,目前服务器统一使用json进行数据通信,这里就不讨论了。
1.3.header相关注解
@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的拦截器中进行统一处理,避免给每个网络接口添加该类信息,显得冗余。
2.业务服务器访问
由于业务服务器需要传输固定的请求header,以及要求进行签名等,因此针对这部分功能进行了封装。
2.1.初始化
WatchHttpCreater.init(new WatchDevice(context), new LauncherAppInfo(context), null);
该函数需在application的onCreate方法中调用,只需要初始化一次即可,重复初始化将抛出RuntimeException,这里初始化的目的,主要是拦截器中,针对服务器特有的签名和参数要求,需要对这类数据进行处理。
2.2.网络请求示例
- http接口声明
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"));
}
});
- subscribeOn
事件发生所处于的线程,网络请求均声明事件发生在io线程。 - observeOn
事件消费线程,如果不申明,事件消费线程将和发生线程在同一个线程,如果涉及到UI操作,声明为android的主线程,否则不必声明。 - BaseUrlManager
该类同一管理了业务服务器网络请求相关的域名信息,便于全局切换域名,测试往往会在多套服务器环境中进行测试。
3.更多信息
用到时,再完善……