Retrofit基本使用

Retrofit基本使用

简介

Retrofit文档
Retrofit Github地址

Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装。Retrofit是一款基于注解把http api转成接口,使用起来更加简单。

Retrofit注解

Retrofit 共23个注解,这节就专门介绍这22个注解,为帮助大家更好理解我将这23个注解分为四大类。

方法注解

对应了HTTP标准中的请求方法,而HTTP注解则可以代替以上方法中的任意一个注解,有3个属性:method、path,hasBody
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9OKsl8eX-1584621921021)(_v_images/20200319181001535_10144.png)]

标记注解

在这里插入图片描述

请求头注解

在这里插入图片描述

参数注解

在这里插入图片描述

简单使用

引入Retrofit依赖及添加权限

    implementation 'com.squareup.retrofit2:retrofit:2.7.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.7.0'

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

创建Retrofit实例

在默认情况下Retrofit只支持将HTTP的响应体转换换为ResponseBody,而Converter就是Retrofit为我们提供用于将ResponseBody转换为我们想要的类型。
在这里插入图片描述

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl("http://localhost:8080")
        //这里我们的数据格式是json,可以用Gson,也可以用Jackson
        .addConverterFactory(GsonConverterFactory.create())
        .build();

注:addConverterFactory是有先后顺序的,如果有多个ConverterFactory都支持同一种类型,那么就是只有第一个才会被使用

初步封装

如果我们每次使用,都要去创建Retrofit,那不是很麻烦吗?

所以我们可以把这些相关的配置,整合起来。把Retrofit的创建和配置定义成一个单例,这样子,我们要去发起请求的时候,直接使用单例获取就完事了。不用再重复去编写baseURL呀,转换器呀,连接时的相关属性,等等…


public class RetrofitManager {
    public static final String BASE_URL = "https://10.0.2.2:8888";
    public static final int CONNECT_TIME_OUT = 10000;//毫秒
    private Retrofit mRetrofit;

    private RetrofitManager() {
        createRetrofit();
    }

    private void createRetrofit() {
        //设置一下okHttp的参数
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .connectTimeout(CONNECT_TIME_OUT, TimeUnit.MILLISECONDS)
                .build();
        mRetrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)//设置BaseUrl
                .client(okHttpClient)//设置请求的client
                .addConverterFactory(GsonConverterFactory.create())//设置转换器
                .build();
    }

    private static RetrofitManager retrofitManager = null;

    public static RetrofitManager getInstance() {
        if(retrofitManager == null) {
            synchronized(RetrofitManager.class) {
                if(retrofitManager == null) {
                    retrofitManager = new RetrofitManager();
                }
            }
        }
        return retrofitManager;
    }

    public Retrofit getRetrofit() {
        return mRetrofit;
    }

}

定义API接口

public interface IUserService {

    @GET
    Call<ResultModel> getUser(@Url String url);

    @GET("/users/{id}")
    Call<ResultModel> getUser(@Path("id")  int id);

    @GET("/users")      //  /user?phone=XXX&name=XXX
    Call<ResultModel> getUser(@Query("phone")  String phone,@Query("name")  String name );

    @GET("/users")      //  /user?phone=XXX&name=XXX
    Call<ResultModel> getUser(@QueryMap Map<String,Object> params);

    @POST("/users")
    Call<ResultModel> postUser(@Body User user);

    /************************* Part  PartMap ****************************/

    @Multipart
    @POST("/files")
    Call<ResultModel> postFile(@Part MultipartBody.Part part);

    @Multipart
    @POST("/files")
    Call<ResultModel> postFiles(@Part List<MultipartBody.Part> parts);

    /**
     * 上传多个文件
     * @param part
     * @param params
     * @return
     */
    @Multipart
    @POST("/files")
    Call<ResultModel> postFilesWithParams(@Part MultipartBody.Part part, @PartMap Map<String,String> params);

    /************************* Field  FieldMap ****************************/

    @POST("/users")
    Call<ResultModel> postUser(@Field("name") String name,@Field("phone")String phone);

    @POST("/users")
    Call<ResultModel> postUser(@FieldMap Map<String,Object> params);

    /************************* Header  Headers  HeaderMap ****************************/

    @POST("/users")
    Call<ResultModel> postUser(@Body User user,@Header("token")String token);

    @Headers({"token:sa56312as1d2","version:1"})
    @POST("/users")
    Call<ResultModel> postUser();

    @POST("/users")
    Call<ResultModel> postFile(@HeaderMap Map<String,String> headers);

}

创建代理对象

    IUserService userService = RetrofitManager.getInstance().getRetrofit().create(IUserService.class);

接口调用

        Call<ResultModel> call = userService.getUser(1);
        call.enqueue(new Callback<ResultModel>() {
            @Override
            public void onResponse(Call<ResultModel> call, Response<ResultModel> response) {
                Log.i(TAG,"response-->"+response.body());
            }

            @Override
            public void onFailure(Call<ResultModel> call, Throwable t) {
                Log.i(TAG,"onFailure-->"+t.getMessage());
            }
        });

        /************************文件上传******************/
        
        File file = new File("/storage/emulated/0/Download/1.jpg");
        MediaType mediaType = MediaType.parse("image/jpg");
        RequestBody fileBody = RequestBody.create(mediaType,file);
        MultipartBody.Part part = MultipartBody.Part.createFormData("file",file.getName(),fileBody);
        Call<ResultModel> task = userService.postFile(part);
        task.enqueue(new Callback<ResultModel>() {
            @Override
            public void onResponse(Call<ResultModel> call,Response<ResultModel> response) {
                Log.d(TAG,"onResponse -- > " + response.body());
            }

            @Override
            public void onFailure(Call<ResultModel> call,Throwable t) {
                Log.d(TAG,"onFailure -- > " + t.toString());
            }
        });
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值