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

PHP cURL POST JSON 至 .NET WebService 失敗:參數名稱不匹配

     編輯:程式設計綜合問答

錯誤現象

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);

若對方強制要求 JSON Body

需確認 ASMX 端已啟用 `ScriptService` / `WebMethod(EnableSession=true)` 並設定 `Content-Type: application/json`,且 JSON 根物件屬性名**嚴格對應參數名** (區分大小寫)。若仍失敗,多半是伺服端未正確配置 JSON 反序列化,改用表單提交最穩妥。

除錯技巧

  • 使用 `curl_setopt($ch, CURLOPT_VERBOSE, true);` 輸出完整請求/回應標頭與 Body。
  • 對比瀏覽器開發者工具 Network 面板成功請求的 `Form Data` 與 PHP 發送的差異。

結論:ASMX 傳統 WebService 預設綁定表單欄位,而非 JSON Body;`http_build_query` 產生標準表單資料即可解決。

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