PHP 使用 `curl` 發送 JSON 至 `.asmx` WebService,對方回傳錯誤;但瀏覽器直接測試該 URL 並手工輸入 JSON 卻成功。
ASMX WebService 預期 **表單欄位名稱** 與方法參數名**完全一致**,且 `Content-Type` 通常為 `application/x-www-form-urlencoded`。直接發送原始 JSON (`application/json`) 導致伺服端無法自動繫結參數。
$serviceURL = 'https://61.153.225.106:5678/Service.asmx/tests';
$params = [
'ccode' => '1234ew4',
'ddate' => '2015-12-16',
'ccuscode' => '0100001',
// ... 其他參數名需與 ASMX 方法簽名完全一致
];
$ch = curl_init($serviceURL);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($params), // 自動編碼為 application/x-www-form-urlencoded
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/x-www-form-urlencoded; charset=utf-8',
],
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
]);
$result = curl_exec($ch);
if (curl_errno($ch)) {
echo "cURL Error: " . curl_error($ch);
} else {
echo $result;
}
curl_close($ch);
需確認 ASMX 端已啟用 `ScriptService` / `WebMethod(EnableSession=true)` 並設定 `Content-Type: application/json`,且 JSON 根物件屬性名**嚴格對應參數名** (區分大小寫)。若仍失敗,多半是伺服端未正確配置 JSON 反序列化,改用表單提交最穩妥。
結論:ASMX 傳統 WebService 預設綁定表單欄位,而非 JSON Body;`http_build_query` 產生標準表單資料即可解決。