网络访问使用说明

网络访问基于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说明
  1. @GET("group/{id}/users")
  2. Call<List<User>> groupList(@Path("id") int groupId);

我们想在url中,动态的传输请求参数时,可以以{param}的格式编写,并使用@Path(“param”)在函数对应参数变量上进行注解即可,例如上面的例子groupId的值为10,那么实际请求的url地址为:group/10/users

  • @Query说明
  1. @GET("users/list")
  2. Call<List<User>> groupList(@Query("sort") String sort);

还有另外一种比较常用的方式为在请求地址后面加?,然后以key=value的形式进行传参,例如我们想给服务器传输一个变量名为sort,变量值为desc的参数,我们可以按照上面的方式进行书写注解.这样实际请求的url为:users/list?sort=desc。

-@QueryMap

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

@Query的方式,只能满足我们传输一个参数,当我们要使用这种格式传输一组参数时,我们可以使用 @QueryMap。

1.2.body相关注解

  1. @POST("users/new")
  2. Call<User> createUser(@Body User user);

在方法形参中加入@Body注解,就可以表明该对象为请求的body参数,retrofit2会根据你配置的ConverterFactory进行对应的序列化,例如配置JacksonConverterFactory,那么请求body会被序列化为json格式。

另外retrofit2还支持表单提交方式等等,目前服务器统一使用json进行数据通信,这里就不讨论了。

1.3.header相关注解

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

@Headers可以给http请求添加固定的header请求信息,如果想给每个请求都添加header固定信息,最好在okhttp的拦截器中进行统一处理,避免给每个网络接口添加该类信息,显得冗余。

2.业务服务器访问

由于业务服务器需要传输固定的请求header,以及要求进行签名等,因此针对这部分功能进行了封装。

2.1.初始化

  1. WatchHttpCreater.init(new WatchDevice(context), new LauncherAppInfo(context), null);

该函数需在application的onCreate方法中调用,只需要初始化一次即可,重复初始化将抛出RuntimeException,这里初始化的目的,主要是拦截器中,针对服务器特有的签名和参数要求,需要对这类数据进行处理。

2.2.网络请求示例

  • http接口声明
  1. public interface RsaHttp {
  2. /**
  3. * 获取rsa公钥
  4. * @return
  5. */
  6. @GET("/rsa")
  7. Observable<BaseResult<Map<String, String>>> getRsaPublicKey();
  8. }

BaseResult该类为服务器返回的固定对象,由于BaseResult中的data对象存在不同类型,为了便于底层统一进行json解析,需要声明data的类型,例如该接口返回的data数据为Map<String, String>类型,因此返回数据声明为BaseResult<Map<String, String>>

  • 网络请求
  1. Observable<BaseResult<Map<String, String>>> observable = WatchHttpCreater.create(BaseUrlManager.getDefaultUrl(), RsaHttp.class).getRsaPublicKey();
  2. observable.subscribeOn(Schedulers.io())
  3. .observeOn(AndroidSchedulers.mainThread())
  4. .subscribe(new Action1<BaseResult<Map<String, String>>>() {
  5. @Override
  6. public void call(BaseResult<Map<String, String>> mapBaseResult) {
  7. System.out.println(mapBaseResult.getData().get("publicKey"));
  8. }
  9. });
  • subscribeOn
    事件发生所处于的线程,网络请求均声明事件发生在io线程。
  • observeOn
    事件消费线程,如果不申明,事件消费线程将和发生线程在同一个线程,如果涉及到UI操作,声明为android的主线程,否则不必声明。
  • BaseUrlManager
    该类同一管理了业务服务器网络请求相关的域名信息,便于全局切换域名,测试往往会在多套服务器环境中进行测试。

3.更多信息

用到时,再完善……

版权声明:本文为zhoujunhua原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhoujunhua/p/5315879.html