Android开发 Retrofit使用

前言

retrofit基于okhttp封装的网络请求框架,网络请求的工作本质上是 OkHttp 完成,而 retrofit 仅负责网络请求接口的封装,Retrofit将每个网络请求定义为java接口的一个方法,定义路径可以由方法的注解提供,header和请求参数可以由方法的参数提供,返回一个Retrofit的Call对象,这种Call对接类似OkHttp的Call,可以有execute和enqueue两种方式执行网络请求,分别是同步和异步。Retrofit优势,就是简洁易用,解耦,扩展性强,可搭配多种Json解析框架(例如Gson,FastJson)。

官方地址:https://square.github.io/retrofit/

Retrofit注解

请求方法
注解代码    请求格式
@GET    GET请求
@POST    POST请求
@DELETE    DELETE请求
@HEAD    HEAD请求
@OPTIONS    OPTIONS请求
@PATCH    PATCH请求
请求参数
注解代码    说明
@Headers    添加请求头
@Path    替换路径
@Query    替代参数值,通常是结合get请求的
@FormUrlEncoded    用表单数据提交
@Field    替换参数值,是结合post请求的

添加依赖

在build.grale添加如下依赖:

implementation 'com.squareup.retrofit2:retrofit:2.6.2'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

添加网络权限

创建实体类

创建实体类用于保存服务器返回的数据

public class User {
    private String userName;
    private String userPassWord;
    public User() {
    }
    public User(String userName, String userPassWord) {
        this.userName = userName;
        this.userPassWord = userPassWord;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPassWord() {
        return userPassWord;
    }

    public void setUserPassWord(String userPassWord) {
        this.userPassWord = userPassWord;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", userPassWord='" + userPassWord + '\'' +
                '}';
    }
}

创建一个网络请求接口

public interface UserApi {
    @FormUrlEncoded
    @POST("test/login") //网络请求路径
    Call login(@Field("userName") String userName, @Field("userPassWord") String userPassWord);
    @GET("test/getUser")
    Call> getUser(@Query("num") String num, @Query("page")String page);
}

创建Retrofit请求基础配置

public class HttpUtil {
    private Retrofit mRetrofit;
    private void initHttpBase() {
        mRetrofit = new Retrofit.Builder()
                .baseUrl("http://127.0.0.1:retrofi/test")//base的网络地址  baseUrl不能为空,且强制要求必需以 / 斜杠结尾
                .addConverterFactory(GsonConverterFactory.create())//使用Gson解析
                .callbackExecutor(Executors.newSingleThreadExecutor())//使用单独的线程处理
                .build();
    }
}

请求网络

这里的mRetrofit.create创建的接口服务,通过 call.enqueue()执行请求,请求成功之后会回到onResponse方法,失败会回到onFailure方法,

private void loginHttp(){
    UserApi userApi = mRetrofit.create(UserApi.class);
    Call call = userApi.login("tony", "123456");
    call.enqueue(new Callback() {
        @Override
        public void onResponse(Call call, Response response) {
            User user = response.body();
            Log.e(TAG, "onResponse: userName="+user.getUserName());
            Log.e(TAG, "onResponse: userPassrod="+user.getUserPassWord());
        }

        @Override
        public void onFailure(Call call, Throwable t) {
            Log.e(TAG, "onFailure: 网络请求失败="+t.getMessage());

        }
    });
}

 这样,我们就完成了一个网络请求

取消网络请求

如果想取消网络,调用如下方法,

call.cancel();

如何给请求添加Header头

以固定数据的形式添加头信息

只需要使用@headers标签,就可以给请求添加头信息

@Headers({"contentUrl:www.baidu.com","content:java"})
@GET("test/getUser")
Call> getUser(@Query("num") String num, @Query("page")String page);

以非固定数据的形式添加头信息

@POST("test/logout")
Call logout(@Header("content") String content);

添加配置的OkHttpClient(主要使用请求超时/拦截器等功能)

使用Okhttp的方式来配置比如请求超时时间/设置拦截器等等

private void initHttpBase() {
    OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .retryOnConnectionFailure(false) //在连接失败时重试
            .callTimeout(50, TimeUnit.SECONDS) //呼叫超时,设置此参数为整体流程请求的超时时间
            .connectTimeout(30,TimeUnit.SECONDS)//连接超时
            .readTimeout(30,TimeUnit.SECONDS)//读取超时
            .writeTimeout(30,TimeUnit.SECONDS)//写入超时
            .callTimeout(3,TimeUnit.SECONDS)//呼叫超时,设置此参数为整体流程请求的超时时间
            .build();
    mRetrofit = new Retrofit.Builder()
            .client(okHttpClient)
            .baseUrl("http://127.0.0.1:retrofi/test")//base的网络地址  baseUrl不能为空,且强制要求必需以 / 斜杠结尾
            .addConverterFactory(GsonConverterFactory.create())//使用Gson解析
            .callbackExecutor(Executors.newSingleThreadExecutor())//使用单独的线程处理
            .build();
}

你可能感兴趣的:(retrofit,android)