Retrofit 简要笔记

阅读 1178
收藏 59
2017-04-23
原文链接:blog.csdn.net

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

导入

retrofit github链接
导入依赖

    //导入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后面

public interface BaseService {
    @GET("user/id")
    Call<Response> getUserInfo(@Query("uid") String uid);
}

如果Query参数比较多,那么可以通过@QueryMap方式将所有的参数集成在一个Map统一传递,还以上文中的get请求方法为例

public interface BaseService {
    @GET("user/id")
    Call<Response> getUserInfo(@QueryMap Map<String, String> options);
}

Post

@FormUrlEncoded将会自动将请求参数的类型调整为application/x-www-form-urlencoded,@Field注解将每一个请求参数都存放至请求体中

    @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统一传递

    @FormUrlEncoded
    @POST("user/emailRegister")
    Observable<HttpResult> emaiRegister(@FieldMap Map<String, String> fields);

@Body,如果Post请求参数有多个,那么可以统一封装到类中

    @FormUrlEncoded
    @POST("user/emailRegister")
    Observable<HttpResult> emaiRegister(@Body EmaiRegister);

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

定义Http请求头参数

 @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注解

public interface BaseService {
    @GET("user/{id}")
    Call<Response> getUserInfo(@Path("id")  String id);
}

上传

    @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一起用,同时做下简单封装,后面另外写一篇整理

评论