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

Android HttpPost 請求失效排查:網絡權限、線程與參數傳遞全解析

     編輯:程式設計疑難解答

問題現象

Android 應用中使用 HttpPost 發送登錄請求,已在 Manifest 添加 INTERNET 權限,但服務器端始終收不到參數,無論是否攜帶參數均無響應。

代碼審視與常見錯誤

1. 網絡請求必須在子線程

代碼中已使用 new Thread(...).start() 包裹網絡操作,這點正確。但注意 DefaultHttpClient 在 API 22+ 已棄用,建議遷移至 HttpURLConnection 或 OkHttp。

2. 參數構建方式有誤

// 原代碼註釋掉了關鍵參數設置
// nameValuePairs.add(new BasicNameValuePair("params", params));
// post.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));

未設置 Entity,服務器自然收不到數據。 應取消註釋並確保參數名與服務器約定一致(如 params 或直接放入 JSON 字符串)。

3. 異常吞沒導致無日誌

catch (Exception e) {
    // Toast.makeText(null,...) 會崩潰,且 e.printStackTrace() 輸出到 Logcat
    e.printStackTrace(); // 必須保留
}

建議在 catch 中記錄完整堆棧,並通過 Log.e 輸出,方便 ADB 查看。

4. URL 與端口驗證

  • 確認 192.168.199.1:8888 在同一局域網且端口開放。
  • 用瀏覽器或 Postman 直接訪問 https://192.168.199.1:8888/gcgl/user.do?method=login 測試接口可用性。

修正後的關鍵代碼

public static String sendPost(String url, String params) {
    String displayString = "1";
    try {
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost post = new HttpPost(url);
        
        // 正確設置參數
        List nameValuePairs = new ArrayList<>();
        nameValuePairs.add(new BasicNameValuePair("params", params));
        post.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));
        
        // 可選:設置超時
        httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 15000);
        httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 15000);
        
        HttpResponse rsp = httpClient.execute(post);
        HttpEntity httpEntity = rsp.getEntity();
        displayString += EntityUtils.toString(httpEntity);
    } catch (Exception e) {
        Log.e("HttpPost", "請求失敗", e); // 關鍵日誌
    }
    return displayString;
}

現代化建議

  • 棄用 org.apache.http,改用 HttpURLConnection 或 OkHttp / Retrofit。
  • 使用 application/json 直接發送 JSON 字符串,避免表單編碼麻煩。
  • 統一網絡層異常處理,提供重試、攔截器等能力。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved