Android 應用中使用 HttpPost 發送登錄請求,已在 Manifest 添加 INTERNET 權限,但服務器端始終收不到參數,無論是否攜帶參數均無響應。
代碼中已使用 new Thread(...).start() 包裹網絡操作,這點正確。但注意 DefaultHttpClient 在 API 22+ 已棄用,建議遷移至 HttpURLConnection 或 OkHttp。
// 原代碼註釋掉了關鍵參數設置
// nameValuePairs.add(new BasicNameValuePair("params", params));
// post.setEntity(new UrlEncodedFormEntity(nameValuePairs, HTTP.UTF_8));
未設置 Entity,服務器自然收不到數據。 應取消註釋並確保參數名與服務器約定一致(如 params 或直接放入 JSON 字符串)。
catch (Exception e) {
// Toast.makeText(null,...) 會崩潰,且 e.printStackTrace() 輸出到 Logcat
e.printStackTrace(); // 必須保留
}
建議在 catch 中記錄完整堆棧,並通過 Log.e 輸出,方便 ADB 查看。
192.168.199.1:8888 在同一局域網且端口開放。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 字符串,避免表單編碼麻煩。