首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android HTTP 請求在 5.1 正常、4.0/4.4 異常的排查指南

     編輯:程式設計疑難解答

現象描述

應用對 PHP 伺服器的 HTTP 請求,在 Android 5.1 上回傳正確 JSON(含城市列表),但在 4.4、4.0 上回傳 {"num":"0","city":{}},資料庫查詢行數也為 0。經多機型測試,確認與硬體無關,純屬系統版本差異。

可能原因分析

  1. 伺服器端邏輯差異:程式碼中是否根據 User-Agent 或 Android 版本執行不同 SQL?
  2. 網路傳輸差異:舊版 Android 的 HTTP 堆疊(HttpURLConnection 實作)可能對特定 Header、壓縮、重導向處理不同。
  3. 客戶端解析問題:舊版本對回應編碼、流讀取行為不同,導致只讀到第一行或解析失敗。

排查步驟

1. 伺服器端驗證

在 PHP 回應前 error_log 記錄完整輸出 JSON,確認是否對所有版本都送出相同資料。檢查是否有針對 $_SERVER['HTTP_USER_AGENT'] 的判斷邏輯。

2. 抓包分析

使用模擬器搭配 Wireshark,對比 5.1 與 4.4 的完整 HTTP 交握過程:請求 Header、回應碼、Content-Encoding、實際 Body 內容。

3. 客戶端隔離測試

在有問題的 4.4 裝置上,請求其他公開 API(如 https://httpbin.org/get),若正常則問題在伺服器端;若仍異常,則是客戶端 HTTP 堆疊或程式碼問題。

程式碼優化建議

// 建議使用 OkHttp 替代 HttpURLConnection,統一各版本行為
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder().url(url).build();
client.newCall(request).enqueue(new Callback() {
    @Override public void onResponse(Call call, Response response) {
        String body = response.body().string();
        // 統一處理回應
    }
    @Override public void onFailure(Call call, IOException e) { /* 錯誤處理 */ }
});

總結

優先鎖定伺服器端是否一致回傳資料,再檢查網路層差異。引入成熟網路庫(OkHttp/Retrofit)可有效屏蔽系統版本差異。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved