androidhttp请求
① Android高版本http网络请求失败的Cordova配置处理
问题出现的原因是因为Android高版本(Android 6.0)以上默认使用TLS保护用户信息,详见以下文档:
Transport Layer Security
摘录关键信息如下:
简单地说,在Android高版本对非加密的明文传输有要求,也即默认启用了TLS保护,使得该应用无法进行http网络请求,而https则不会受影响,同样地,如果应用嵌套了webview也会受这限制。
针对这种情况,有以下解决方案:
然后在AnroidManifest.xml中的application添加指向该文件的设置项:
android:networkSecurityConfig="@xml/network_security_config"
综合考量,第3种方案个人认为会好点,Cordova配合其使用也很简单:
在config.xml文件中,在 <platform name="android"/> 节点内添加配置项即可:
这样Cordova build的时候就会把上面配置合并到AnroidManifest.xml中。
② Android版本28使用http请求报错not permitted by network security policy
解决办法:
1 targetSdkVersion 降级回到 27 (没测试)
2 服务器和本地应用都改用 https (推荐)(没测试)
3 在 res 下新建一个 xml 目录,然后创建一个名为:network_security_config.xml 文件 ,该文件内容如下
在 AndroidManifest.xml application增加配置android:networkSecurityConfig="@xml/network_security_config"
③ 说说在 Android 中如何发送 HTTP 请求
客户端会向服务器发出一条 HTTP 请求,服务器收到请求后会返回一些数据给客户端,然后客户端再对这些数据进行解析与处理。
可以使用 HttpURLConnection(官方推荐) 来发送 HTTP 请求。
布局文件:
活动类:
因为在 Android 中不允许在子线程中执行 UI 操作,所以我们通过 runOnUiThread 方法,切换为主线程,然后再更新 UI 元素。
最后记得声明网络权限哦:
OKHttp 是一个处理网络请求的开源项目,目前是 Android 最火热的轻量级框架,由移动支付 Square 公司贡献(该公司还贡献了Picasso)。希望替代 HttpUrlConnection 和 Apache HttpClient。
首先引入 OKHttp 库依赖:
然后点击 Android Studio 右上角的 Sync Now,把库真正加载进来。
修改活动类:
可以在 build() 方法之前连缀很多其他方法来丰富这个 Request 对象。
如果是 POST 请求,那么需要构建 RequestBody 对象,形如:
修改活动类:
注意: new Thread(...) 之后需要执行 start() 才会启动线程哦。
运行:
可以看出,OKHttp 比 HttpURLConnection 更强大:同一个网址,OKHttp 能够正确地返回响应数据哦O(∩_∩)O哈哈~
④ 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 发送大量的http请求怎么做最好呢
你应该写清楚应用场景,懒得写代码,只写思路
分两种使用场景吧,第一种,就是无脑post,对服务器造成很大负担(如果这就是你的目的),那你只需要写个timer循环,每隔一秒或者几秒post服务端就行了
第二种,在get到结果后循环post,这个方式比较合理,不需要timer循环,对服务器负荷也小,需要一个hanlderMessage,在get到结果或异常后给hanlderMessage发送消息,handlerMessage再执行一次post即可
⑥ Android网络请求库【OkHttp4.9.3】基本用法与原理分析
OkHttp是一套处理 HTTP 网络请求的依赖库,由 Square 公司设计研发并开源,目前可以在 Java 和 Kotlin 中使用。对于 Android App 来说,OkHttp 现在几乎已经占据了所有的网络请求操作,Retrofit + OkHttp实现网络请求似乎成了一种标配。因此它也是每一个 Android 开发工程师的必备技能,了解其内部实现原理可以更好地进行功能扩展、封装以及优化。
OkHttp的高效性体现在:
第一步:创建OkHttpClient,创建OkHttpClient有两种方式:
OkHttpClient提供了丰富的配置方法,例如添加拦截器、指定连接池、设置请求超时等等。
第二步:创建请求
使用Request.Builder() 构建Request实例
第三步:发起网络请求
OkHttp支持同步和异步两种请求方式
OkHttp的使用方法非常简单,三步操作就可以发起一个简单的同步或异步请求。我们也可以很轻松地对网络请求进行配置,例如添加请求头、设置请求方式、设置请求超时等等,这些配置参数会在源码分析过程中详细介绍。
现在我们已经学会了三步操作发起网络请求,接下来以这三个步骤为切入点,深入到源码中学习OkHttp的实现原理,废话少说马上开车。
OkHttpClient创建方式有两种,我们看看两种方式有什么区别。
第一种直接使用默认构造函数,内部依然是使用建造者模式
第二种使用建造者模式
两种方式最终都是调用构造函数OkHttpClient(builder:Builder),由参数builder负责所有的参数配置工作。
当您创建单个OkHttpClient实例并将其用于所有 HTTP 调用时,OkHttp 性能最佳。 这是因为每个OkHttpClient都拥有自己的连接池和线程池,重用连接和线程可减少延迟并节省内存。 相反,为每个请求创建一个客户端会浪费空闲池上的资源。
Request同样使用建造者模式来创建,这里贴上部分重要源码,很简单就不细说了。
OkHttp发起网络请求分为同步请求和异步请求两种方式,我们只分析异步请求流程,因为只要理解了异步请求过程,基本上也就明白同步请求是怎么一回事了。
RealCall是连接应用层与网络层的桥梁,负责处理连接、请求、响应和数据流。
Dispatcher维护着一套异步任务执行策略,分析策略之前先介绍几个重要概念:
client.dispatcher.enqueue(AsyncCall(responseCallback)) 执行步骤为:
AsyncCall实现了Runnable接口,因此一旦被线程池中的线程处理就会调用它的run()方法:
话休絮烦,我们开始分析拦截器责任链:
责任链执行流程:首先获取当前拦截器interceptor,并且调用interceptor.intercept(next)执行拦截器操作。这里的next表示的是index+1后的责任链对象,拦截器的intercept()方法内部会调用next.proceed(request)方法再次进入到责任链,由于此时index已经加1,所以处理的是下一个拦截器。
如此循环往复,直到处理完责任链上最后一个拦截器为止。
注意除最后一个拦截器CallServerInterceptor不会调用chain.proceed(request)方法之外,其他拦截器都应该至少调用一次chain.proceed(request)方法。
为了验证上面的结论,我们进入到RetryAndFollowUpInterceptor的intercept()方法一探究竟:
可以看到注释1处重新进入责任链处理下一个拦截器。
有兴趣可以自行查看最后一个拦截器CallServerInterceptor源码,此处只给出本人阅读源码后得出的结论:
以上就是拦截器责任链的工作流程,我们再通过流程图仔细感受一下。
分析完拦截器责任链,我们继续分析AsyncCall#run()方法:
我们看到,如果()方法成功获得服务端返回的数据,则调用responseCallback.onResponse(this@RealCall, response)方法完成异步回调;如果服务端数据获取失败(请求异常),则调用responseCallback.onFailure(this@RealCall, canceledException)方法完成异步回调
需要注意的是,responseCallback回调是在子线程中完成的,所以如果想把数据显示到UI上,需要切换回主线程进行UI操作。
OkHttp发起网络请求全过程:
【知识点】OkHttp 原理 8 连问
⑦ 完美解决Android 9.0以上HTTP网络请求被限制问题
Android P 9.0以上系统,HTTP网络被限制。HTTPS无影响。
Android 10系统同样的问题。
Android P以上要求网络请求必须为Https,Http请求会抛异常。
Android P以上的应用默认都被限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。同时,目标API级别为27或更低的应用程序的默认值为“ true”。面向API级别28或更高级别的应用默认为“ false”。
需要在AndroidManifest.xml文件中设置:
android:usesCleartextTraffic 指示应用程序是否打算使用明文网络流量,例如明文HTTP。
忽略证书,可以使用明文流量访问,https&http都可以访问。
避免明文通信的主要原因是缺乏机密性,真实性和防篡改保护;网络攻击者可以窃听所传输的数据,并且还可以对其进行修改而不会被检测到。
别忘记在Android.Manifest.xml文件中添加网络访问权限哦!
⑧ android9.0以上http请求失败的解决方法
在android9.0以上由于安全性高了,所有不做处理http不能使用,有3中解决方法
1.最简单的方法降级targetSdkVersion的版本
将 targetSdkVersion 将到27或27以下
2.服务器请求http改为https (推荐)
推荐使用这个方法,毕竟https的安全行高
3.兼容http请求
(1):在清单文件中设置networkSecurityConfig属性
(2)在res/xml文件夹下创建network_security_config.xml
⑨ Android 我的一个APP有时会出现HTTP请求失败的情况,其他应用正常联网,重启后恢复正常
是不是没有在异步线程中请求数据
⑩ Android中允许开启HTTP请求
Android 7后默认禁止了非HTTPS请求,如果在请求中使用HTTP会报如下错误:
我们可以在Manifest的Application节点配置 networkSecurityConfig 属性来自定网络安全策略,如下:
在 \res\xml 目录下新建 network_security_config.xml 文件:
更多具体描述可以参考 官方文档