Retrofit攻略
使用Retrofit首先必须添加下面三个;远程;依赖
compile ‘com.squareup.retrofit2:retrofit:2.1.0’
compile ‘com.squareup.retrofit2:converter-gson:2.1.0’
compile ‘com.squareup.retrofit2:adapter-rxjava:2.1.0’
public interface BlueService {
@GET("book/search")
Call<BookSearchResponse> getSearchBooks(@Query("q") String name,
@Query("tag") String tag, @Query("start") int start,
@Query("count") int count);
}
类似上面的代码,@GET表示请求的方法,Call 是请求的返回结果,BookSearchResponse是返回的实体类(可以是Gson的解析类)
1 GET方法
@GET 表示是个get请求
1、 @Query 表示请求 参数
**如果一个参数是非必须传的那么可以传 null
**当出现一个参数对应多个值的时候Query可以对应一个集合 for example:
public interface BlueService {
@GET("book/search")
Call<BookSearchResponse> getSearchBooks(@Query("q") List<String> name);
}
2、 @QueryMap 当请求参数过多的时候可以把参数放到一个map当中,retrofit会帮助我们处理参数
3、@Path 当请求的相对地址;也需要我们传的时候需要用到@Path
**@Path同事还可以用于Post和Delete请求
2 POST方法
1、@Field 类似于GET方法的Query但是是吧参数放在请求实体里,而不是拼接在url上面
2、@FieldMap 当请求有多个请求参数的时候就用@FieldMap类似于GET请求的QueruyMap
3、@Body 请求的参数是一个实体类,而且这个实体类的参数是可以没有get和set方法的,但是参数必须是公有的(Public)
4、@Part 上传文件
step:1 构造参数
public interface FileUploadService {
// 上传单个文件
@Multipart
@POST("upload")
Call<ResponseBody> uploadFile(
@Part("description") RequestBody description,
@Part MultipartBody.Part file);
// 上传多个文件
@Multipart
@POST("upload")
Call<ResponseBody> uploadMultipleFiles(
@Part("description") RequestBody description,
@Part MultipartBody.Part file1,
@Part MultipartBody.Part file2);
}
step:2 上传
Uri file1Uri = ... // 从文件选择器或者摄像头中获取
Uri file2Uri = ...
// 创建上传的service实例
FileUploadService service =
ServiceGenerator.createService(FileUploadService.class);
// 创建文件的part (photo, video, ...)
MultipartBody.Part body1 = prepareFilePart("video", file1Uri);
MultipartBody.Part body2 = prepareFilePart("thumbnail", file2Uri);
// 添加其他的part
RequestBody description = createPartFromString("hello, this is description speaking");
// 最后执行异步请求操作
Call<ResponseBody> call = service.uploadMultipleFiles(description, body1, body2);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call,
Response<ResponseBody> response) {
Log.v("Upload", "success");
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.e("Upload error:", t.getMessage());
}
});
post方法上传文件需要多加一个@Multipart注解