一、前言:为什么说他是一个网络通呢?
retrofit本身没有提供网络访问的能力,因为他封装了okHttp,提供了比okhttp更加简单的访问方式。使用retrofit首先需要引入依赖。
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
这篇文章需要请求的接口和服务器域名
https://httpbin.org/
二、基本使用步骤:
1.根据Http接口创建java接口
在app中添加一个Interface命名为HttpbinServic
/**
* 学习retrofit的基本使用
*/
public interface HttpbinService {
@POST("post")//post注解表明当前这个接口需要通过post方法请求
@FormUrlEncoded//表单提交
Call<ResponseBody> post(@Field("userName") String userName, @Field("password") String pwd);
@GET("get")//get注解表明当前这个接口需要通过get方法请求
Call<ResponseBody> get(@Query("userName") String userName, @Query("password") String pwd);
}
2.创建Retrofit对象,并生成接口实现类对象,以及接口实现类对象调用对应方法获得响应
/**
* retrofit的基本使用
*/
public class OkhttpTestActivity extends AppCompatActivity {
private Retrofit retrofit;
private HttpbinService httpbinService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_okhttp_test);
retrofit = new Retrofit.Builder().baseUrl("http://www.httpbin.org/").build();//创建retrofit对象
httpbinService = retrofit.create(HttpbinService.class);//创建接口类对象,并且设置为全局变量。
}
public void postAync(View view) {//post异步请求
/**
* retrofit的基本使用
*/
retrofit2.Call<ResponseBody> call = httpbinService.post("Anglin", "123");//调用接口post方法得到call对象
call.enqueue(new retrofit2.Callback<ResponseBody>() {//通过call对象执行异步请求
@Override
public void onResponse(retrofit2.Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
try {
System.out.println(response.body().string());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
public void onFailure(retrofit2.Call<ResponseBody> call, Throwable t) {
}
});
}
}
3.运行结果展示
4.在运行的时候中途出现报错
CLEARTEXT communication to www.httpbin.org not permitted by network security policy。主要原因是文明通信到“www.httpbin.org ”不允许网络安全政策。
具体原因:
Android P系统限制了文明流量的网络请求,所以OkHttp3会抛出该异常。
解决方案一:
- 在res目录先新建xml文件命名为network_security_config.xml
- 添加如下内容
-
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
-
接下来在Manifest.xml中添加如下配置
-
解决方案二:
把tagetSDKVersion降级回到27。
三、retrofit使用跟OkHttp使用之间的对比
1.不需要创建requestBody。
2.不需要创建request。
3.retrofit自动帮助我们封装好了,使用retrofit的注解自动帮我们生成requestBody和request。
4.只要拿到接口类对象然后调用接口类对象里面的方法就能完成接口的调用
5.如果是多个域名,就可以新建多个接口类对象,管理不同的服务器