Retrofit简要笔记

2017/04/23 Android

本文整理记录常用注解的用法

导入

retrofit github链接 导入依赖 java //导入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' //与rxjava配合使用需导入以下的库 compile 'io.reactivex:rxandroid:1.1.0' compile 'io.reactivex:rxjava:1.1.0' ## 注解使用 ### GET 创建业务请求接口,@GET注解就表示get请求,@Query表示请求参数,将会以key=value的方式拼接在url后面 java public interface BaseService { @GET("user/id") Call<Response> getUserInfo(@Query("uid") String uid); } 如果Query参数比较多,那么可以通过@QueryMap方式将所有的参数集成在一个Map统一传递,还以上文中的get请求方法为例 java public interface BaseService { @GET("user/id") Call<Response> getUserInfo(@QueryMap Map<String, String> options); }

Post

@FormUrlEncoded将会自动将请求参数的类型调整为application/x-www-form-urlencoded,@Field注解将每一个请求参数都存放至请求体中 java @FormUrlEncoded @POST("user/emailRegister") Observable<HttpResult> emaiRegister(@Field("email") String email, @Field("password") String password, @Field("name") String name, @Field("language") int language); @FieldMap,同理,通过Map统一传递 java @FormUrlEncoded @POST("user/emailRegister") Observable<HttpResult> emaiRegister(@FieldMap Map<String, String> fields); @Body,如果Post请求参数有多个,那么可以统一封装到类中 ```java @FormUrlEncoded @POST(“user/emailRegister”) Observable emaiRegister(@Body EmaiRegister);

public class Reviews {
    public String email;
    public String password;
    public String name;
    public String language;
} ```

定义Http请求头参数 java @Headers({ "Accept: application/vnd.yourapi.v1.full+json", "User-Agent: Your-App-Name" }) @POST("user/emailRegister") Observable<HttpResult> emaiRegister(@Field("email") String email, @Field("password") String password, @Field("name") String name, @Field("language") int language); ### Path 请求的相对地址也是需要调用方传递,那么可以使用@Path注解 java public interface BaseService { @GET("user/{id}") Call<Response> getUserInfo(@Path("id") String id); } ### Multipart 上传 java @Multipart @POST("user/uploadHead") Observable<HttpResultT<HeadUrl>> uploadHeadPic(@Part("uid") RequestBody userId, @Part MultipartBody.Part photo);

private void uploadPic(File file) {
        BaseService baseService = NetManager.getInstance().create(BaseService.class);
        RxManager.getInstance().doSubscribeT(baseService.uploadHeadPic(createBody(), createFilePart("head_pic", file)), new RxSubscriber<HeadUrl>() {

            @Override
            protected void _onError(Throwable e) {
                myLog.e("s: " + e.getMessage());
            }

            @Override
            protected void _onNext(HeadUrl headUrl) {
                myLog.d("s: " + headUrl.getHead_url());
                myPrefs.picUrl().put(PIC_BASE_URL + headUrl.getHead_url());
            }
        });
    }

    private RequestBody createBody() {
        return RequestBody.create(
                MediaType.parse(MULTIPART_FORM_DATA), myPrefs.uid().get());
    }

    private MultipartBody.Part createFilePart(String partName, File file) {
        // 为file建立RequestBody实例
        RequestBody requestFile =
                RequestBody.create(MediaType.parse(MULTIPART_FORM_DATA), file);

        // MultipartBody.Part借助文件名完成最终的上传
        return MultipartBody.Part.createFormData(partName, file.getName(), requestFile);
    }

具体使用上,结合RXjava一起用,同时做下简单封装,后面另外写一篇整理

Search

    Table of Contents