retrofit简介
RESTful 网络请求框架的封装
网络请求的本质是OKHttp来完成,而retrofit 仅负责网络接口的封装
retrofit实例
一 retrofit的安装
我们将以JSON格式发送和接收数据,因此我们也添加了converter-gson依赖项
gradle 方式:
dependencies {
.....
//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.6.1'
implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
}
在AndroidManifest.xml添加网络访问权限
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
二 REST API建模
- REST API 接口
http://mock.fulingjie.com/mock/api/address.php
{
"code": 0,
"message": "OK",
"data": [
{
"id": 1,
"default": true,
"name": "姓名1",
"phone": "123456",
"address": "地址1"
},
{
"id": 2,
"default": false,
"name": "姓名2",
"phone": "123456",
"address": "地址2"
}
]
}
- 业务数据模型
public class AddrApiResponse {
private List<AddressBean> data;
private String code ;
private String message ;
public String toString() {
return "UserApiResponse [data=" + data.toString() + "]";
}
}
public class AddressBean {
private int id;
@SerializedName("default")
private boolean defaultX;
private String name;
private String phone;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public boolean isDefaultX() {
return defaultX;
}
public void setDefaultX(boolean defaultX) {
this.defaultX = defaultX;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "AddressBean{" +
"id=" + id +
", defaultX=" + defaultX +
", name='" + name + '\'' +
", phone='" + phone + '\'' +
", address='" + address + '\'' +
'}';
}
}
- 业务接口
Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数
public interface AddrService {
@GET("/mock/api/{filename}")
public Call<AddrApiResponse> getAddrs(@Path("filename") String filename);
}
网络请求的完整 Url =在创建Retrofit实例时通过.baseUrl()设置 +网络请求接口的注解设置(下面称 “path“ )

-
网络请求
网络请求1.png
-
标记类型
网络请求标记.png
-
请求参数
网络请求参数.png
4.请求方法
网络请求方法.png
- 我们可以使用适当的改造注释为每个HTTP方法:@GET,@POST,@PUT,@DELETE,@PATCH或@HEAD。
- 在方法注释中,我们应该指定REST资源的相对端点URL。在这种情况下,它是 - "/api/users/{id}"。
- 在方法声明中,我们必须将服务器所期望的数据返回到一个类型化的Retrofit Call< >类中。
- 在方法参数中,我们可以传递路径和查询参数,并在PUT / POST请求中请求正文。
三 retrofit使用
在android 4.0以后所有网络请求 不能在UI线程执行 所以同步请求网络也需要在子线程来完成
public class AddrServiceClient {
//同步方法调用
public void getAddrsData(){
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://mock.fulingjie.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient.build())
.build();
AddrService service = retrofit.create(AddrService.class);
Call<AddrApiResponse> callSync = service.getAddrs("address.php");
Response<AddrApiResponse> response = callSync.execute();
AddrApiResponse apiResponse = response.body();
Log.d("rrcc",apiResponse.toString());
} catch (Exception ex) {
ex.printStackTrace();
}
}
}).start();
}
//异步方法调用
public void getSyncAddrs(){
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://mock.fulingjie.com/")
.addConverterFactory(GsonConverterFactory.create())
.client(httpClient.build())
.build();
AddrService service = retrofit.create(AddrService.class);
Call<AddrApiResponse> callSync = service.getAddrs("address.php");
callSync.enqueue(new Callback<AddrApiResponse>() {
//请求成功时回调
@Override
public void onResponse(Call<AddrApiResponse> call, Response<AddrApiResponse> response) {
//请求处理,输出结果
System.out.println(response.toString());
}
//请求失败时候的回调
@Override
public void onFailure(Call<AddrApiResponse> call, Throwable throwable) {
System.out.println("连接失败");
}
});
}
}
文章参考:
https://www.jianshu.com/p/865e9ae667a0
http://www.leftso.com/blog/664.html
网友评论