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

Android 登入請求傳參失敗:IllegalArgumentException 根因分析

     編輯:程式設計綜合問答

錯誤現象

Android 客戶端發起登入請求時,伺服器拋出 java.lang.IllegalArgumentException,提示參數不合法或不正確。常見原因在於請求參數構建方式錯誤。

典型錯誤代碼

// 錯誤示範:將參數直接拼接在 URL 後
String url = "https://api.example.com/login?username=" + user + "&password=" + pwd;
HttpGet request = new HttpGet(url);

此做法存在多重風險:

  • 特殊字符(如 @、#、空格)未經 URL 編碼導致參數解析錯誤
  • 密碼明文出現在 URL 中,安全性極低
  • GET 請求長度受限,不適合攜帶較大數據

正確解決方案

1. 使用 POST 請求 + 表單實體

HttpPost post = new HttpPost("https://api.example.com/login");
List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("username", user));
params.add(new BasicNameValuePair("password", pwd));
post.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

2. 參數編碼與簽名

  • 所有參數值必須經 URLEncoder.encode(value, "UTF-8") 編碼
  • 敏感操作應加簽名(如 HMAC-SHA256)防篡改
  • 採用 HTTPS 傳輸保障機密性

3. 使用成熟網絡庫

建議採用 OkHttp、Retrofit 等現代網絡框架,自動處理參數編碼、連接池、重試等細節:

// Retrofit 介面定義
@FormUrlEncoded
@POST("login")
Call<LoginResponse> login(@Field("username") String user, @Field("password") String pwd);

排查檢查清單

  1. 確認伺服器端期望的參數名、類型、必填性
  2. 檢查請求 Header(Content-Type: application/x-www-form-urlencoded)
  3. 抓包(Charles/Fiddler)對比正常與異常請求的原始報文
  4. 查看伺服器端完整堆疊追蹤定位具體參數校驗失敗點

總結

參數傳遞失敗多源於手動拼接 URL 導致編碼缺失或格式錯誤。採用標準 POST 表單提交、成熟網絡庫並嚴格進行參數編碼,可從根本上消除此類問題。

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