初识Retrofit
1基本使用
首先Retrofit是通过Interface来管理HTTP API,而且这个接口不能继承其他接口
public interface APIService {
@FormUrlEncoded
@POST("login")
Flowable<HttpResult<UserInfoData>> login(@FieldMa Map<String, String> map);//登陆
}
然后通过Retrofit.Builder获取到Retrofit实例,并通过create(clazz)方法获取到我们刚才创建的RetrofitApi接口实例:
Retrofit retrofit=new Retrofit.Builder()
.baseUrl(baseurl)
.build();
RetrofitApi retrofitApi=retrofit.create(APIService .class);
有了RetrofitApi实例之后,我们就可以在需要网络请求的地方调用了:
Call<BaseResult<User>> userCall=retrofitApi.login();
注:baseUrl("")中的url必须以’/'结尾,否则会报异常;@GET(“public”)中的url如果是需要拼接在baseUrl之后的则不要以‘/’开头。
2.Retrofit的注解
HTTP注解-GET 写法:
@GET("public")
Call<BaseResult<List<User>>> getUser();
HTTP注解-POST 写法:
@POST("User")
Call<BaseResult<String>> addUser();
Retrofit支持三种标记类注解,分别是:FormUrlEncoded、Multipart、Streaming。
标记类注解-FormUrlEncoded:指请求体是一个Form表单,Content-Type=application/x-www-form-urlencoded,需要和参数类注解@Field,@FieldMap搭配使用;
@FormUrlEncoded
@POST("login")
Flowable<HttpResult<UserInfoData>> login(@FieldMap Map<String, String> map);
@FormUrlEncoded
@POST("public")
Call<BaseResult> addUser(@Field("userName") String userName);
标记类注解-Multipart:指请求体是一个支持文件上传的Form表单,Content-Type=multipart/form-data,需要和参数类注解@Part,@PartMap搭配使用
@Multipart
@POST("public")
Call<BaseResult> uploadFile(@Part MultipartBody.Part file);
@Multipart
@POST("users/image")
Call<BaseResponse<String>> uploadFilesWithParts
(@Part() List<MultipartBody.Part> parts);
@POST("users/image")
Call<BaseResponse<String>> uploadFileWithRequestBody
(@Body MultipartBody multipartBody);
使用@Multipart注解方法,并用@Part注解方法参数,类型是List< okhttp3.MultipartBody.Part>
不使用@Multipart注解方法,直接使用@Body注解方法参数,类型是okhttp3.MultipartBody
标记类注解-Streaming:指响应体的数据以流的形式返回,如果不使用默认会把数据全部加载到内存,所以下载文件时需要加上这个注解
@Streaming
@GET("download")
Call<ResponseBody> downloadFile();
参数类注解-Headers:添加请求头,作用于方法
@Headers("Cache-Control: max-age=640000")
@GET("public")
Call<BaseResult<List<User>>> getUser();
或
@Headers({
"Cache-Control: max-age=640000"
"User-Agent: Retrofit-Sample-App"
})
@GET("public")
Call<BaseResult<List<User>>> getUser();
参数类注解-Header:用于动态添加头部,作用于方法参数
@GET("public")
Call<BaseResult<List<User>>> getUser(@Header("Token") String token);
参数类注解-Body:用于非表单请求体,作用于方法参数
第一种
@POST("user")
Call<BaseResult<String>> addUser(@Body User user);
第二种
@POST("{api}")
Observable<String> request(@Path("api") @NonNull String api,
@Body Map<String, Object> para);
参数类注解-Url:用于动态改变Url,作用于方法参数
@GET("public")
Call<BaseResult<List<User>>> getUser(@Url String url);
请求的时候,url会替换掉public
参数类注解-Path:用于替换请求地址,作用于方法参数
@GET("{public}")
Call<BaseResult<List<User>>> getUser(@Path("public") String path);
请求的时候,path会替换掉public
参数类注解-Field:用于表单字段参数,(需要配合FormUrlEncoded使用)作用于方法参数
@FormUrlEncoded
@POST("public")
Call<BaseResult> addUser(@Field("userName") String userName);
参数类注解-FieldMap:用于表单字段参数,接收Map实现多个参数,(需要配合FormUrlEncoded使用)作用于方法参数
@FormUrlEncoded
@POST("public")
Call<BaseResult> addUser(@FieldMap Map<String,String> fieldMap);
参数类注解-Part:用于表单字段参数,适用于文件上传,(需要配合Multipart使用)作用于方法参数
@Multipart
@POST("public")
Call<BaseResult> uploadFile(@Part MultipartBody.Part file);
参数类注解-PartMap:用于表单字段参数,适用于文件上传,(需要配合Multipart使用)作用于方法参数
@Multipart
@POST("public")
Call<BaseResult> uploadFile(@PartMap Map<String,RequestBody> RequestBodyMap);
参数类注解-Query:用于条件字段参数,作用于方法参数(主要在GET中使用)
@GET("public")
Call<BaseResult<List<User>>> getUser(@Query("userId") String userId);
参数类注解-QueryMap:用于条件字段参数,作用于方法参数(主要在GET中使用)
@GET("public")
Call<BaseResult<List<User>>> getUser(@QueryMap Map<String,String> map);
参数类注解-@Body 作用于方法参数
@POST("public")
Call<BaseResult<List<User>>> getUser(@Body( User user);
注:
使用Post请求方式(数据都是被放在请求体中上传到服务器):
1、表单提交:建议使用Field或FieldMap+FormUrlEncoded,以键值对上传到服务器;
2、JSON提交:建议使用@Body,大部分都是实体类,最后将实体类转换为JSON,上传服务器;
使用GET请求(将参数拼接在url后面的)
1、建议使用Query或QueryMap都是将参数拼接在url后面的;
转自
作者:廉颇未老
链接:https://www.jianshu.com/p/1f3b646db6d5
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。