关于androidokhttp的信息
本篇文章给大家谈谈androidokhttp,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、Android使用OkHttp请求自签名的https网站
- 2、androidokhttp怎么return
- 3、Android OkHttp3 :最简单&粗暴(使用与原理)讲解
- 4、Android OKHttp使用
- 5、android okhttp https请求
- 6、Android Studio 引用OkHttp
Android使用OkHttp请求自签名的https网站
很多公司考虑到安全问题,项目中都采用https加密协议进行数据传输。但是一些公司又不想花一笔钱去CA申请证书,所以就采用自签名的证书。
OkHttp默认是可以访问通过CA认证的HTTPS链接,例如百度首页也是https链接( )。 但是如果是你们公司自签名(即自己用keytool生成的证书,而不是搭此银采用通过CA认证的证书)的服务器,OkHttp是无法访问的,例如访问12306网站( ) ,会报如下错误:
HTTPS在传输数据之前需要客户端(浏览器)与服务端(网站)之间进行一次握手,在握手过程中将确立双方加密传输数据的密码信息。握手过程的简单描述知宴如下:
握手过程中如果有任何错误,都会使加密连接断开,从而阻止了隐私信息的传输。
以下我们使用12306网站为例扒盯
注意:别忘了加权限和依赖okhttp库
Demo地址:
参考博客:
androidokhttp怎么return
implementation ‘com.squareup.okhttp3:okhttp:3.4.1’
1、发送Get请求:
下面我们来看一下OkHttp的具体用法,首先需要创建一个OkHttpClient的实例,如下所示:
OkHttpClient client = new OkHttpClient();
接下来如果想要发起一条HTTP请求,就需要创建一个Request对象:
Request request = new Request.Builder().build();
当然,上述代码只是创建了一个空的Request对象,并没有什么实际作用,我们可以在最终的build()方茄含法之前连缀很多其他方法来丰富这个Request对象。比如可以通过url()方法来设置目标的网络地址,如下所示:
Request request = new Request.Builder().url(“”).build();
之后调用OkHttpClient的newCal1()方法来创建一个Cal1对象,并调用它的execute()方法来发送请求并获取服务器返回的数据,写法如下:
Response response = client.newCall(request).execute();
其中Response对象就是服务器返回的数据了,我们可以使用如下写法来得到返虚笑回的具体内容:
String responseData = response.body().string();
2、发送Post请求
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("username","admin")
.add("password","123456")
.build();
然后在Request.Builder中调用一下post()方法,并将RequestBody对象传人:
Request request = new Request.Builder()
.url("")
·post(requestBody)
.build();
Response response = client.newCall(request).execute();
String responseData = response.body().string();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
GSON解析返回数据
导包:implementation ‘com.google.code.gson:gson:2.7’ //用来解析后面okhttp请求服务器后返回的json数据
比如说一段JSON格式的数据如下所示:{“name”:“Tom”,“age”:20}
那我们就可以定义一个Person类,并加入name和age这两个字段,然后只需简单地调用
如下代码就可以将JSON数据自动解析成一个Person对象了:
Gson gson = new Gson();
Person person = gson.fromJson(jsonData, Person.class);
如果需要解析的是一段JSON数组会稍微麻烦一点,我们需要借助TypeToken将期望解析成
的数据类型传入到fromJson()方差纳含法中,如下所示:
List people = gson.fromJson(jsonData, new TypeTokenList(){}.getType());
常见报错
1、还是在调用远程接口,进行网络通信的时候,报了如下错误:
W/System.err: java.net.UnknownServiceException:
CLEARTEXT communication to xxx.xxx.xxx not permitted by network security policy
原因:
为保证用户数据和设备的安全,Google针对下一代 Android 系统(Android P) 的应用程序,将要求默认使用加密连接,这意味着 Android P 将禁止 App 使用所有未加密的连接,因此运行 Android P 系统的安卓设备无论是接收或者发送流量,未来都不能明码传输,需要使用下一代(Transport Layer Security)传输层安全协议,而 Android Nougat 和 Oreo 则不受影响。
在Android P系统的设备上,如果应用使用的是非加密的明文流量的http网络请求,则会导致该应用无法进行网络请求,https则不会受影响,同样地,如果应用嵌套了webview,webview也只能使用https请求。
(1)改用https请求
(2)targetSdkVersion 降到27以下
(3)在 application 元素中添加:
android:usesCleartextTraffic=”true”
![image.png](;crop=0crop=0crop=1crop=1from=pasteheight=246id=u1adc76b0margin=[object Object]name=image.pngoriginHeight=306originWidth=599originalType=urlratio=1rotation=0showTitle=falsesize=36156status=donestyle=nonetaskId=u740598ac-8510-4d4c-9488-4ad0a9d8f77title=width=481)
2、报错java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.webviewapplication/com.example.webviewapplication.OkHttpActivity}: android.os.NetworkOnMainThreadException在主线程中的网络异常错误
public class OkHttpActivity extends AppCompatActivity {
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ok_http);
textView = findViewById(R.id.response_text01);
//直接在下面这种情况运行会报错,因为 在Android4.0以后,会发现,只要是写在主线程(就是Activity)中的HTTP请求,
//运行时都会报错,这是因为Android在4.0以后为了防止应用的ANR(Aplication Not Response)异常,Android这个设
//计是为了防止网络请求时间过长而导致界面假死的情况发生。
//我们这里的代码是MainActivity跳转过来的,依然还是在主线程中
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url("").build();
try {
Response response = client.newCall(request).execute();
String respnseData = response.body().string();
System.out.println("结果是"+respnseData);
} catch (IOException e) {
e.printStackTrace();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[img]Android OkHttp3 :最简单&粗暴(使用与原理)讲解
注释1:WebSocket是一个接口,它的实现类RealWebSocket,该类完成WebSocket的连接、数据请求与接收功能。
注释1:将RealCall实例添加至Dispatcher中(下文会介绍Dispatcher)。
注释2:通过getResponseWithInterceptorChain()获取响应。
注释3:通过封装好的拦截器集合,获取第一个拦截器的任务。
注释4:触发第一个拦截器的任务,该任务就触发一下拦截器的任务,以此类推,原理(Android事件传递机制)如下图:
注释1:把AsyncCall请求对象传递进Dispatcher线程池管理;
注释2:通过getResponseWithInterceptorChain()获取响应;
注释1:获取自定义线程池;
注释2:判断正在执行的异步请求数量与请求集合中相同host的数量是否满足,如果满足就添加到执行中改轮的集合中,并添加至线程池中执行请求;如果不满足就添加至待执行请求的集合中,等待执行中的请求完成之后,再执行相同host数量判断满足才添加至线程池中执行请求;
注释3:将请求对象AsyncCall添加进请求执行的集合中;
注释4:将请求对象AsyncCall添加进线程池中执行;
注释5:当不满足执行条件时(注释2),把请求对象添加至待执行的集合中;
注释6:每当一个请求执行完毕时,就会调用finished()去掉对应集合中的存储备歼岩对象,并在次判断待执行的集合中是否有满足仿御条件的请求,若满足就添加至执行的集合与线程池中执行,若不满足继续等待下一个请求完成再次判断。
注释7:判断待执行的集合中是否满足可执行的对象。
2.RealConnection与HttpCodec初始化(RealConnection在ConnectInterceptor中通过StreamAllocation的newStream()初始化,而HttpCodec在RealConnection中被初始化)
Android OKHttp使用
OKHttp是一个十分常用的网络请求框架肆亩了,所以一定要学野散习它的使用,更甚者还需要阅读它的源码和了解实现逻辑。 OKHttp官网 , OKHttp源码
网络优化方面:
(1)内置连接池,支持连接复用;
(2)支持gzip压缩响应体;
(3)通过缓存避免重复的请求;
(4)支持http2,对一台机器的所有请求共享同一个socket。
功能方颂雹氏面:
功能全面,满足了网络请求的大部分需求
扩展性方面:
责任链模式使得很容易添加一个自定义拦截器对请求和返回结果进行处理
在build.gradle中添加如下的依赖即可:
可以参考官网: Vars and Vals
另外有一篇文章把OKHttp的流程总结的不错,可以参考: 神秘网友
android okhttp https请求
忽略SSL证书的方法
//获取TrustManager
private static TrustManager[] getTrustManager() {
//不校检证书链
TrustManager[] trustAllCerts = new TrustManager[]{
new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) {
//悔搏不校检客户端证书
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) {
//不校检服务器证书
}
兄前毕 @Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[]{};
//OKhttp3.0以前返回null,3.0以后返回new X509Certificate[]{};
}
}
};
return trustAllCerts;
}
//获取这个SSLSocketFactory
//通过这个类我们可以获得SSLSocketFactory,这个东西就是用来管理证书和信任证书的
public static SSLSocketFactory getSSLSocketFactory() {
羡芹 try {
SSLContext sslContext = SSLContext.getInstance("SSL");
sslContext.init(null, getTrustManager(), new SecureRandom());
return sslContext.getSocketFactory();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//获取HostnameVerifier
public static HostnameVerifier getHostnameVerifier() {
HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
//未真正校检服务器端证书域名
return true;
}
};
return hostnameVerifier;
}
public OkHttpClient getOkHttpClient() {
if (mOkHttpClient == null) {
mOkHttpClient = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.sslSocketFactory(new SSLSocketClient().getSSLSocketFactory())//配置
.hostnameVerifier(new SSLSocketClient().getHostnameVerifier())//配置
// .readTimeout(10, TimeUnit.SECONDS)
.build();
}
return mOkHttpClient;
}
原文链接: Android https请求证书处理
Android Studio 引用OkHttp
1、引用步骤
1)File--Project Structure(MAC 快捷洞缺键 cmd + ;) 选择纳困辩Dependencies
2)点击加尺哪号,选择Library Dependency 搜索OKhttp
关于androidokhttp和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。