学习了鸿大的《Retrofit2 完全解析探索与okhttp之间的关系》后,记录下使用步骤。
一、导入依赖
这里httpClient我选用了OkHttp,解析工具选用了Gson。
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
compile 'com.squareup.okhttp3:okhttp:3.2.0'
compile 'com.squareup.okhttp3:logging-interceptor:3.2.0'
二、 定义Api接口对象
public interface ApiService {
/**
* 1、一般get请求
*
* @return
* @Url http://api.com/getBooks
*/
@GET("getBooks")
Call<List<Book>> getBooks();
/**
* 2、动态url @Path(不能用于传参)
*
* @param str
* @return
* @Url http://api.com/str/getBooks
*/
@GET("{sid}/getBooks")
Call<List<Book>> dynamicUrl(@Path("sid") String str);
/**
* 3、查询参数@Query(GET)
*
* @param str
* @return
* @url http://api.com/getBookByName?name=str
*/
@GET("getBookByName")
Call<Book> getBookByName(@Query("name") String str);
/**
* 3、查询参数@Query(POST)
*
* @param str
* @param i
* @return
* @url http://api.com/getBookByAuthorAndYear
*/
@POST("getBookByAuthorAndYear")
Call<Book> getBookByAuthorAndYear(@Query("author") String str, @Query("year") Integer i);
/**
* 4、POST的json字符串请求体@Body
*
* @param book
* @return
* @url http://api.com/addBook
*/
@POST("addBook")
Call<String> addBook(@Body Book book);
/**
* 5、表单的方式提交键值对@FormUrlEncoded
*
* @param str1
* @param str2
* @return
* @url http://api.com/getBookByAuthorAndName
*/
@POST("getBookByAuthorAndName")
@FormUrlEncoded
Call<Book> getBookByAuthorAndName(@Field("author") String str1, @Field("name") String str2);
/**
* 6、单文件上传@Multipart(动态文件名)
*
* @param file
* @param id
* @return
* @url http://api.com/addCoverById
*/
@POST("addCoverById")
@Multipart
Call<String> addCoverById(@Part MultipartBody.Part file, @Part("id") RequestBody id);
/**
* 6、单文件上传@Multipart(固定文件名)
*
* @param file
* @return
* @url http://api.com/uploadPic
*/
@POST("uploadPic")
@Multipart
Call<String> uploadPic(@Part("file\"; filename=\"filename.png") RequestBody file);
/**
* 7、多文件上传/多参数请求@PartMap
*
* @param files
* @param params
* @return
* @url http://api.com/uploadPics
*/
@POST("uploadPics")
@Multipart
Call<String> uploadPics(@PartMap Map<String, RequestBody> files, @PartMap Map<String, RequestBody> params);
/**
* 8、文件下载,建议直接用OkHttp
* @return
* @url http://api.com/download
*/
@GET("download")
Call<ResponseBody> download();
}
三、初始化
1.创建HttpClient,这里就不详细说明,具体去看OkHttp的使用方法
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
mOkHttpClient = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.connectTimeout(30, TimeUnit.SECONDS)
.build();
2.构建Retrofit
Retrofit retrofit = new Retrofit.Builder()
// http请求的baseUrl
.baseUrl(BASE_URL)
// 指定HttpClient
.client(HttpClient.get())
// 指定解析工具
.addConverterFactory(GsonConverterFactory.create())
.build();
mApiService = retrofit.create(ApiService.class);
四、使用
1.同步请求
try {
Call<List<Book>> call = getApiService().dynamicUrl("sid");
Response<List<Book>> response = call.execute();
List<Book> books = response.body();
// to do something ...
} catch (IOException e) {
e.printStackTrace();
}
2.异步请求
Call<List<Book>> call = getApiService().getBooks();
call.enqueue(new Callback<List<Book>>() {
@Override
public void onResponse(Call<List<Book>> call, Response<List<Book>> response) {
if (response != null && response.isSuccessful() && response.body() != null) {
Log.d(TAG, "getBooks onResponse: " + response.body().toString());
List<Book> books = response.body();
// to do something ...
}
}
@Override
public void onFailure(Call<List<Book>> call, Throwable t) {
t.printStackTrace();
}
});
3.基础数据类型转ResponseBody
RequestBody.create(MediaType.parse("multipart/form-data"), String/Integer/Boolean/...)
4.File类型转ResponseBody
RequestBody.create(MediaType.parse("image/png"), File)
5.单文件上传
File file = new File(Environment.getExternalStorageDirectory(), "icon.png");
RequestBody requestBody = HttpUtil.imagePng2RequestBody(file);
MultipartBody.Part cover = MultipartBody.Part.createFormData("photos", "icon.png", requestBody);
Call<String> call = getApiService().addCoverById(cover, HttpUtil.multipartFormData2RequestBody("id"));
6.多文件/多参数上传
File file1 = new File(Environment.getExternalStorageDirectory(), "icon1.png");
File file2 = new File(Environment.getExternalStorageDirectory(), "icon2.png");
File file3 = new File(Environment.getExternalStorageDirectory(), "icon3.png");
Map<String, RequestBody> files = new HashMap<String, RequestBody>();
files.put("photos\"; filename=\"icon.png", HttpUtil.imagePng2RequestBody(file1));
files.put("photos\"; filename=\"icon.png", HttpUtil.imagePng2RequestBody(file2));
files.put("photos\"; filename=\"icon.png", HttpUtil.imagePng2RequestBody(file3));
Map<String, RequestBody> params = new HashMap<String, RequestBody>();
params.put("key1", HttpUtil.multipartFormData2RequestBody("param1"));
params.put("key2", HttpUtil.multipartFormData2RequestBody("param2"));
Call<String> call = getApiService().uploadPics(files, params);
7.文件下载
// IO操作要放在子线程进行,so~用同步方法下载
try {
Call<ResponseBody> call = getApiService().download();
Response<ResponseBody> response = call.execute();
InputStream is = response.body().byteStream();
// save file
} catch (Exception e) {
e.printStackTrace();
}