Retrofit2 网络请求框架

Retrofit2 网络请求框架

Retrofit2源码地址

一,简介:

Retrofit可以将服务端的数据接口 API 转换为在客户端的Java对象,即可进行方法调用,得到希望请求的数据。它采用注解的方式动态生成请求API。
1.首先,创建远程请求接口:

public interface UsersService{
        @GET("users/{id}")
        Call<ResponseBody> getUser(@Path("id") int id);
    }

2.用Retrofit生成Java类并向服务器请求数据

public void getHttpData(){
        //服务器地址
        String url = "http://your.service.url.com/";
        //以服务器地址创建Retrofit
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .build();
        //以Retrofit生成API的Java对象
        UsersService usersService = retrofit.create(UsersService.class);
        //想服务器请求数据
        Call<ResponseBody> call = usersService.getUser(3);
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                //成功返回数据response.body().toString()
            }

            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
                //请求失败
            }
        });
    }
二, 添加依赖库support支持:
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
//Gson转换器
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
//RxJava适配器
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'
三,Converter与CallAdapter

Converter可以将ResponseBody转换为我们想要的类型。
CallAdapter可以将Call转换为RxJava的Observable。即可对返回数据进行RxJava操作。
添加工厂方法:

Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
三,Retrofit注解

你应该知道的HTTP基础知识
请求类:GET,POST,PUT,DELETE,HEAD,PATCH,OPTIONS,HTTP
标记类:FormUrlEncoded,MultiPart,Streaming
参数类:Headers,Header,Body,Field,FieldMap,Part,PartMap,Path,Query,QueryMap,Url

1.@GET 获取数据(查)
请求类型:GET,路径:users/{id} 表示users表下的id,{id}表示数字,@Path标记路径为id,返回ResponseBody。

public interface UsersService{
        @GET("users/{id}")
        Call<ResponseBody> getUser(@Path("id") int queryId);
    }

2.@POST 提交数据(增),把参数放在请求体传送给后台。
返回Response或者Result两种写法都可以,@Body表示请求体,这里使用CallAdapter将Call转换为Observable,使用Converter转ResponseBody为Gson类

public interface UsersService {
        @POST("users")
        Observable<Response<User>> addUser(@Body User user);
    }

    public void getHttpData() {
        //服务器地址
        String url = "http://your.service.url.com/";
        //以服务器地址创建Retrofit
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        //以Retrofit生成API的Java对象
        UsersService usersService = retrofit.create(UsersService.class);
        Observable<Response<User>> response = usersService.addUser(new User());
        response.subscribe(new Consumer<Response<User>>() {
            @Override
            public void accept(Response<User> userResponse) throws Exception {
                //处理response
            }
        });
    }

3.@PUT 更新数据(改)
这里使用CallAdapter将Call转换为Observable,使用Converter转ResponseBody为Gson类。

public interface UsersService{
        @PUT("users/{id}")
        Observable<Result<User>> updateUser(@Path("id") int id,@Body User user);
    }

4.@DELETE 删除数据(删)

public interface UsersService{
        @DELETE("users/{id}")
        Observable<Response<User>> deleteUser(@Path("id") int id);
    }

5.@PATCH

6.@OPTIONS

7.@HEAD

8.@HTTP 可以替换上面7中类型
9.@Path 用于制定Url中的路径,如“users/{id}”,可以指定id。

public interface UsersService{
        @HTTP(method = "GET",path = "users/{id}",hasBody = false)
        Observable<Response<User>> getUser(@Path("id") int id);
    }

10.@FormUrlEncoded 表示请求体是一个表单(Content-Type:application/x-www-form-urlencoded),参数在请求方法中,发送form-encoded的数据,每个键值对需要用@Filed来注解键名,随后的对象需要提供值。

public interface addService {
        @FormUrlEncoded
        @POST("users")
        Observable<Response<User>> addUser(@Field("name") String name, @Field("age") int age);
    }

11.@Multipart 表示这是一个支持文件上传的表单,发送form-encoded的数据,每个键值对需要用@Part来注解键名,随后的对象需要提供值。
12.@Streaming 表示数据以流的形式返回。
13.@Headers 在头部添加请求头参数。
14.@Header 在参数中添加请求头参数。

public interface UsersService {
        @Headers({"key:value","key2:value2"})
        @POST("users")
        Observable<Response<User>> addUsers(@Header("key3") String value3);
    }

15.@Body 以POST传递自定义对象,采用Gson传递对象User。

public interface addService {
        @POST("users")
        Observable<Response<User>> addUser(@Body User user);
    }

16.@Field 以POST提交,指定请求体字段的key-alue。
17.@FieldMap 以POST提交,以Map封装多对数据到请求体。配合 @FormUrlEncoded 使用

public interface UsersService {
        @FormUrlEncoded
        @POST("users")
        Observable<Response<User>> addUser(@FieldMap Map<String, Object> map);
    }

    public void getHttpData() {
        Map<String, Object> mMap = new HashMap<>();
        mMap.put("name", "song");
        mMap.put("age", 25);
        mMap.put("address", "adfsdfsdf");

        //服务器地址
        String url = "http://your.service.url.com/";
        //以服务器地址创建Retrofit
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(url)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        //以Retrofit生成API的Java对象
        UsersService usersService = retrofit.create(UsersService.class);
        Observable<Response<User>> response = usersService.addUser(mMap);
        response.subscribe(new Consumer<Response<User>>() {
            @Override
            public void accept(Response<User> userResponse) throws Exception {
                //处理response
            }
        });
    }

18.@Part 以POST提交数据,与 @Multipart 注解配合使用。Part后面支持三种类型,RequestBody、 okhttp3.MultipartBody.Part 、任意类型。
除 okhttp3.MultipartBody.Part以外,其它类型都必须带上表单字段,因为okhttp3.MultipartBody.Part中已经包含了表单字段的信息)。
19.@PartMap 以POST提交数据,与 @Multipart 注解配合使用。支持 RequestBody 类型,如果有其它的类型,会被Converter转换成 RequestBody,如GsonRequestBodyConverter。

public interface UsersService {
        @POST("/form")
        @Multipart
        Observable<Result<User>> upLoad1(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);

        @POST("/form")
        @Multipart
        Observable<Response<User>> upLoad2(@PartMap Map<String, RequestBody> args, @Part MultipartBody.Part file);
    }

20.@Query 用于指定Url之后的参数,用法类似@Field。
21.@QueryMap 用于指定Url后面的多个参数,用法类似@FieldMap。
22.@Url 当请求头没有指定Url时,需要在参数中指定Url

public interface UsersService {
       @GET
       Observable<Response<User>> getUser(@Url String url, @Query("id") int id, @QueryMap Map<String,Object> map);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值