retrofit基于okhttp封装的网络请求框架,网络请求的工作本质上是 OkHttp 完成,而 retrofit 仅负责网络请求接口的封装,Retrofit将每个网络请求定义为java接口的一个方法,定义路径可以由方法的注解提供,header和请求参数可以由方法的参数提供,返回一个Retrofit的Call对象,这种Call对接类似OkHttp的Call,可以有execute和enqueue两种方式执行网络请求,分别是同步和异步。Retrofit优势,就是简洁易用,解耦,扩展性强,可搭配多种Json解析框架(例如Gson,FastJson)。
官方地址:https://square.github.io/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);
}
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();
以固定数据的形式添加头信息
只需要使用@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);
使用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(); }