网络访问基于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>>>() {@Overridepublic void call(BaseResult<Map<String, String>> mapBaseResult) {System.out.println(mapBaseResult.getData().get("publicKey"));}});
用到时,再完善……
原文:http://www.cnblogs.com/zhoujunhua/p/5315879.html