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

Java 接收 C# HTTP 傳遞參數為 null 之解決方案

     編輯:程式設計綜合問答

問題現象

C# 客戶端以 HTTP GET 方式傳送 JSON 字串參數 strJson 給 Java 伺服器(Struts2 框架),伺服器卻報警告:

Parameter [?strJson] didn't match acceptedPattern pattern!

導致後端無法取得參數值(為 null)。

請求範例

https://192.168.1.189/host.htm?strJson={"userCode":"515645619841654561","userNumber":"NO56f52344654","userName":"李三"}

根本原因分析

  1. 字元編碼不一致:C# 預設以 UTF-8 送出,Java 伺服器若未正確設定請求編碼,會導致中文或特殊字元解析錯誤。
  2. Struts2 參數名稱模式限制:Struts2 預設的 acceptedPattern 可能攔截了包含特殊字元(如大括號、冒號、引號)的參數值。
  3. GET 請求長度限制:URL 長度過長可能被伺服器或 Proxy 截斷。

解決方案

1. 統一字元集編碼

在 Java 端確保請求編碼為 UTF-8:

// 在 Filter 或 Controller 入口設定
request.setCharacterEncoding("UTF-8");

C# 端發送時亦明確指定編碼:

var url = "https://.../host.htm?strJson=" + Uri.EscapeDataString(jsonString);

2. 調整 Struts2 參數名稱模式

在 struts.xml 中放寬模式(或針對該 Action 關閉):

<constant name="struts.acceptedParamNames" value=".*" />

或針對特定 Action 設定:

<action name="host" class="com.example.HostAction">
    <param name="acceptedParamNames">.*</param>
    <result>/host.jsp</result>
</action>

3. 改用 POST 請求傳遞 JSON

建議將大型 JSON 放在 Request Body 中以 POST 方式送出,避免 URL 長度限制與特殊字元轉義問題。

// C# 範例
using (var client = new HttpClient()) {
    var content = new StringContent(jsonString, Encoding.UTF8, "application/json");
    var response = await client.PostAsync("https://.../host.htm", content);
}

Java 端對應以 @RequestBody 或 Struts2 的 JSON 互通外掛接收。

驗證步驟

  1. 檢查伺服器端 request.getParameter("strJson") 是否能正確取值。
  2. 確認資料庫或日誌中儲存的 JSON 格式完整無誤。
  3. 若仍失敗,啟用 Struts2 除錯日誌觀察參數解析過程。

總結

核心在於「編碼一致」與「參數模式放寬」。長期來看,採用 POST + JSON Body 為更穩健的跨語言介接方式。

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