1、什么是Retrofit框架? 它是Square公司开发的现在非常流行的网络框架
2.为什么使用Retrofit框架 性能好,处理快,使用简单,Retrofit 是安卓上流行的HTTP Client库之一
默认使用OKHttp处理网络请求,我觉得可以看成是OKHttp的增强。
默认使用Gson解析
二、配置Retrofit2.0 //配置retrofit2.0
compile 'com.squareup.retrofit2:converter-gson:+'
//配置支持Rxjava2
compile 'com.squareup.retrofit2:adapter-rxjava2:+'
compile 'io.reactivex.rxjava2:rxjava:+'
compile 'io.reactivex.rxjava2:rxandroid:+'
1.构造Retrofit
***baseUrl:****
1. 默认的服务器地址,Retrofit在进行请求一个接口时会根
1.构造Retrofit
***baseUrl:****
1. 默认的服务器地址,Retrofit在进行请求一个接口时会根据你填写的
baseurl+方法名 去请求。
****addConverterFactory:****
添加返回数据的解析方式,Retrofit支持多种格式的解析,xml,json,
jackson,Moshi,Protobuf,wire等,添加对这些数据格式的支持同样需要在
Gradle中进行依赖。这些依赖Square公司同样提供了支持。
****CallAdapter:****
Retrofit会将网络请求的接口以回调的方式返回,我们通常会得到一个叫做
Call<类型>的结果,如果我们需要返回其他的结果,例如RxJava形式的结果,需
要对RxJava做支持。如果不需要特殊类型的返回结果,我们是不需要配置的。
****Client:****
通过该方法我们可以添加自己定制的OkHttp。
三、创建接口 声明API 四、Retrofit各个注解的含义及作用
------------------------------------ GET注解
用于发送一个get请求 GET注解一般必须添加相对路径或绝对路径或者全路径,如果不想在 GET注解后添加请求路径,则可以在方法的第一个参数中用@Url注解添加请 求路径
Url注解:
作用于方法参数 用于添加请求的接口地址
示例: @GET Call<ResponseBody> list(@Url String url);
Path注解:
作用于方法的参数
在URL路径段中替换指定的参数值。使用String.valueOf()和URL编码 将值转换为字符串。 使值不可为用该注解定义的参数的空 参数值默认使用URL编码
示例: //默认使用URL编码 @GET("/user/{name}") Call<ResponseBody> encoded(@Path("name") String name); //不使用URL编码 @GET("/user/{name}") Call<ResponseBody> notEncoded(@Path(value="name", encoded=true) String name);
Query注解:
作用于方法的参数 用于添加查询参数,即请求参数 参数值通过String.valueOf()转换为String并进行URL编码 使用该注解定义的参数,参数值可以为空,为空时,忽略该值,当传入一个 List或array时,为每个非空item拼接请求键值对,所有的键是统一的,如: name=张三&name=李四&name=王五.
示例: @GET("/list") Call<ResponseBody> list(@Query("page") int page); @GET("/list") Call<ResponseBody> list(@Query("category") String category); //传入一个数组 @GET("/list") Call<ResponseBody> list(@Query("category") String... categories); //不进行URL编码 @GET("/search") Call<ResponseBody> list(@Query(value="foo", encoded=true) String foo);
QueryMap注解:
作用于方法的参数 以map的形式添加查询参数,即请求参数
参数的键和值都通过String.valueOf()转换为String格式 map的键和值默认进行URL编码 map中每一项的键和值都不能为空,否则抛出 IllegalArgumentException异常
示例: //使用默认URL编码 @GET("/search") Call<ResponseBody> list(@QueryMap Map<String, String> filters); //不使用默认URL编码 @GET("/search") Call<ResponseBody> list(@QueryMap(encoded=true) Map<String, String> filters); --------------------------------------- POST注解:
用于发送一个POST请求 POST注解一般必须添加相对路径或绝对路径或者全路径,如果不想在 POST注解后添加请求路径,则可以在方法的第一个参数中用@Url注解添加 请求路径
FormUrlEncoded注解:
用于修饰Field注解和FieldMap注解 使用该注解,表示请求正文将使用表单网址编码。字段应该声明为参 数,并用@Field注释或FieldMap注释。使用FormUrlEncoded注解的请 求将具”application / x-www-form-urlencoded” MIME类型
Field注解
作用于方法的参数 用于发送一个表单请求
@FormUrlEncoded @POST("/") Call<ResponseBody> example(@Field("name") String name,@Field("occupation") String occupation);
//固定或可变数组 @FormUrlEncoded @POST("/list") Call<ResponseBody> example(@Field("name") String... names); FieldMap注解:
作用于方法的参数 用于发送一个表单请求 map中每一项的键和值都不能为空,否则抛出 IllegalArgumentException异常
@FormUrlEncoded @POST("/things") Call<ResponseBody> things(@FieldMap Map<String, String> fields);
Header注解:
作用于方法的参数,用于添加请求头 使用该注解定义的请求头可以为空,当为空时,会自动忽略,当传入一个 List或array时,为拼接每个非空的item的值到请求头中. 具有相同名称的请求头不会相互覆盖,而是会照样添加到请求头中
示例: @GET("/") Call<ResponseBody> foo(@Header("Accept-Language") String lang);
1 2
HeaderMap注解:
作用于方法的参数,用于添加请求头
以map的方式添加多个请求头,map中的key为请求头的名称,value为 请求头的值,且value使用String.valueOf()统一转换为String类型, map中每一项的键和值都不能为空,否则抛出 IllegalArgumentException异常
示例: @GET("/search") void list(@HeaderMap Map<String, String> headers);
//map Map<String,String> headers = new HashMap()<>; headers.put("Accept","text/plain"); headers.put("Accept-Charset", "utf-8");
Headers注解:
作用于方法,用于添加一个或多个请求头 具有相同名称的请求头不会相互覆盖,而是会照样添加到请求头中
示例: //添加一个请求头 @Headers("Cache-Control: max-age=640000") @GET("/") ... //添加多个请求头 @Headers({ "X-Foo: Bar", "X-Ping: Pong" }) @GET("/") ...