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 文件:
更多具體描述可以參考 官方文檔