好处
- 解耦好
- 可配置度高
- 速度快
库
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.okhttp3:okhttp:3.14.0'
权限
<uses-permission android:name="android.permission.INTERNET"/>
要使用Retrofit最好先大体了解下注解:
https://blog.csdn.net/weixin_39821531/article/details/88787749
Retrofit注解
- 请求方法
注解代码 | 请求格式 |
---|---|
@GET | GET请求 |
@POST | POST请求 |
@DELETE | DELETE请求 |
@HEAD | HEAD请求 |
@OPTIONS | OPTIONS请求 |
@PATCH | PATCH请求 |
- 请求参数
注解代码 | 说明 |
---|---|
@Headers | 添加请求头 |
@Path | 替换路径 |
@Query | 替代参数值,通常是结合get请求的 |
@FormUrlEncoded | 用表单数据提交 |
@Field | 替换参数值,是结合post请求的 |
网络接口
Retrofit通过接口创建网络请求;
举个淘宝查询IP的例子:
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;
public interface GetIpService {
@GET("service/getIpInfo.php")
Call<IpResult> getIpInfo(
@Query("ip") String ip
);
}
数据类
接口中返回的数据,上例中的IpResult,就是数据类;
这需要根据实际返回的数据来编写;
{
"code":0,
"data":
{
"ip":"21.22.11.33",
"country":"美国",
"area":"",
"region":"纽约",
"city":"纽约",
"county":"XX",
"isp":"XX",
"country_id":"US",
"area_id":"",
"region_id":"US_132",
"city_id":"US_1084",
"county_id":"xx",
"isp_id":"xx"
}
}
- {}里面的是类;
- 成员用,隔开;
- :前是成员名称,:后是成员值;
所以,上面的数据是,一个code成员+一个内部类data;
public class IpResult {
private String code;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public DataBean getData() {
return data;
}
public void setData(DataBean data) {
this.data = data;
}
public static class DataBean {
//省略N多get/set方法
}
}
创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("http://ip.taobao.com/")
.build();
用GsonConverterFactory需要引入对应的库
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
网络接口实例
GetIpService IGetIp = retrofit.create(GetIpService.class);
异步网络请求
Call<IpResult> resultCall = IGetIp.getIpInfo("21.22.11.33");
resultCall.enqueue(new Callback<IpResult>() {
@Override
public void onResponse(Call<IpResult> call, Response<IpResult> response) {
Log.v(TAG, "onResponse");
IpResult result = response.body();
if (result != null) {
Log.v(TAG, "result=" + result.getCode() + ", " + result.getData().getCountry());
}
}
@Override
public void onFailure(Call<IpResult> call, Throwable t) {
Log.v(TAG, "onFailure");
}
});
运行结果:
V/x999x: onFailure
然后结果失败了,有些尴尬;但在网页上确实是好的;
只能尝试另外一个IP地址的接口;
http://ip.tianqiapi.com/?ip=27.193.13.255
修改baseUrl、接口和数据类后,再运行;
V/x999x: onResponse
V/x999x: result2=21.22.11.33, 美国
好像可以了;
注意:
@GET里面没有东西的不能写成@GET()或者@GET,会报错!需要写成@GET("/")!
简单说明
淘宝接口;
http://ip.taobao.com/service/getIpInfo.php?ip=21.22.11.33
拼接
baseUrl("http://ip.taobao.com/")
@GET("service/getIpInfo.php")
Call<IpResult> getIpInfo(
@Query("ip") String ip
);
键值对可以有很多;