关于okhttp3网络框架的onfailure错误
刚开始用okhttp3框架时遇到了很多坑,而且编程技术的发展日新月异,看网上教程有时候会看到一些比较旧的方法,因此很可能会走很多弯路。我本人就是在刚开始使用okhttp3时遇到很多问题,书上、网上的教程或多或少有些跟不上。今天我主要讲的是使用okhttp3的基础和时遇到的 onfailure( ) 问题,顺便也为自己做个笔记。
参考链接:
https://www.jianshu.com/p/3600483f9c9f
1. okhttp3基础
这个框架我也不介绍了。
首先我用了两个控件,分别是Button和Textview,点击Button后就会发送请求获取信息,Textview则是显示获取到的信息。
<Button
android:id="@+id/b1"
android:textSize="50dp"
android:text="click me"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/t1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello"
android:textSize="50dp"/>
接着就是JAVA代码了
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button b1;
private TextView t1;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1=findViewById(R.id.b1);
t1=findViewById(R.id.t1);
btn1.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if(view.getId()==R.id.b1)
sendRequest();
}
public void sendRequest() {
//1,创建OKHttpClient对象
OkHttpClient okHttpClient = new OkHttpClient();
String url = "http://www.baidu.com";
//注意我这里用的是http而不是https
//2,创建一个Request
final Request request = new Request.Builder()
.url(url)
.build();
//3,创建一个call对象
Call call = okHttpClient.newCall(request);
//4,将请求添加到调度中
call.enqueue(new Callback() {
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
Log.d(TAG, "onResponse:response "); //用来看是否有响应
final String data=response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
t1.setText(data);
}
});
}
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
Log.d(TAG, "onFailure: failure"); //用来看是否失败
}
});
}
}
到了这里okhttp3的应用已经完成了,接着我点击按钮,发现logcat里面打印出来的是 onfailure ,这是为什么呢?
我上网查了一下,原来是Android P全面禁止了非https链接,并严格审查网站的CA证书 详情请看这里
但是国内的很多网站都是非https的,怎么办呢?
这时候我们需要在自己设置非安全连接。
非安全连接设置
首先,我们在res/xml下建立我们自己的network security config文件,名字任意,可以叫做network_security_config.xml。
如图所示
接着在里面设置
<network-security-config>
<!--默认允许所有网址使用非安全连接-->
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
再在AndroidManifest.xml里加一段代码,注意@xml/network_security_config就是刚刚命名的名字。
<application
android:networkSecurityConfig="@xml/network_security_config"
....................
</application>
做完以后,你会发现http网络请求就可以通过啦。