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":"李三"}
acceptedPattern 可能攔截了包含特殊字元(如大括號、冒號、引號)的參數值。在 Java 端確保請求編碼為 UTF-8:
// 在 Filter 或 Controller 入口設定
request.setCharacterEncoding("UTF-8");
C# 端發送時亦明確指定編碼:
var url = "https://.../host.htm?strJson=" + Uri.EscapeDataString(jsonString);
在 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>
建議將大型 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 互通外掛接收。
request.getParameter("strJson") 是否能正確取值。核心在於「編碼一致」與「參數模式放寬」。長期來看,採用 POST + JSON Body 為更穩健的跨語言介接方式。