Retrofit2使用步骤

学习了鸿大的《Retrofit2 完全解析探索与okhttp之间的关系》后,记录下使用步骤。

Demo代码

一、导入依赖

这里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();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值