Retrofit与okhttp共同出自于Square公司,retrofit就是对okhttp做了一层封装。把网络请求都交给给了Okhttp,我们只需要通过简单的配置就能使用retrofit来进行网络请求了,其主要作者是Android大神JakeWharton。
@FormUrlEncoded ---> 这个是和@Field一起使用的;
@POST("good/recommendgood")
Observable<String> makeMoneyGoodsRecommend(@Header("token") String token, @Field("size") String size);
查询参数也可以添加。@Query是在get请求url出现?时出现查询的;
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
Retrofit的底层也是由 OkHttp 网络加载库来支持的。
关于 Retrofit 的原理,有三个十分重要的概念:『注解』,『动态代理』,『反射』。将会在以后逐步进行分析。
Java 注解 基础知识点
定义:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。
作用分类:
①编写文档:通过代码里标识的元数据生成文档【生成文档doc文档】
②代码分析:通过代码里标识的元数据对代码进行分析【使用反射】
③编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】
{user} 类似于占位符的作用,具体类型由 repo(@Path("user") String user) 指定,这里表示 {user} 将是一段字符串。
Retrofit 中,有许多的注解:
其中,包含了与请求方法相关的 @GET、@POST、@HEAD、@PUT、@DELETA、@PATCH,和参数相关的@Path、@Field、@Multipart等。
第一种是静态配置,直接在接口中指定 Header 参数:
第二种是动态配置:
@GET("/user")
Call<TestModel> getUser(@Header("Authorization") String authorization)
GET 请求参数设置和POST 请求参数设置是不一样的;
踩过的坑
Retrofit踩坑之Delete请求
http://blog.csdn.net/u014752325/article/details/59589437
@DELETE("bean/delete")
Observable<CommonBean> deleteBean(@Body DeleteUserBody body);
那就根据这个改一下呗
@HTTP(method = "DELETE", path = "location/delete", hasBody = true)
正解:
// 删除收货地址 —————— 迷之错误、 addressid 与 id 有什么分别吗?
@DELETE("address/delete/{addressid}")
Observable<String> deleteAddressData(@Header("token") String token, @Path("addressid") String addred);
// 异常状态信息的处理、
public void onError(Throwable e) {
LogUtils.e("mxg", "requestVerificationCodeForLogin ==onError== " + e.getMessage());
// TODO 异常的处理、
if (e instanceof HttpException) {
HttpException httpException = (HttpException) e;
try {
String responseString = httpException.response().errorBody().string();
JSONObject jsonObject = new JSONObject(responseString);
String msg = jsonObject.getString("msg");
LogUtils.e("mxg", "responseString = " + responseString + ",msg = " + msg);
ToastUtil.showToast(context, msg);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}