关于okhttp3网络框架的onfailure错误

关于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。

如图所示
关于okhttp3网络框架的onfailure错误_第1张图片

接着在里面设置

<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网络请求就可以通过啦。

你可能感兴趣的:(关于okhttp3网络框架的onfailure错误)