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

PHP cURL 發送 JSON 數據完整可用代碼範例

     編輯:程式設計綜合問答

核心代碼 (已驗證可運行)

function httpPostJson(string $url, array $data, int $timeout = 30): array {
    $ch = curl_init();
    $json = json_encode($data, JSON_UNESCAPED_UNICODE);

    curl_setopt_array($ch, [
        CURLOPT_URL            => $url,
        CURLOPT_POST           => true,
        CURLOPT_POSTFIELDS     => $json,
        CURLOPT_RETURNTRANSFER => true,          // 直接返回響應體
        CURLOPT_HTTPHEADER     => [
            'Content-Type: application/json; charset=utf-8',
            'Content-Length: ' . strlen($json),
            'Accept: application/json',
        ],
        CURLOPT_TIMEOUT        => $timeout,      // 總超時
        CURLOPT_CONNECTTIMEOUT => 10,            // 連接超時
        CURLOPT_SSL_VERIFYPEER => false,         // 測試環境跳過證書驗證
        CURLOPT_SSL_VERIFYHOST => false,
    ]);

    $response = curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $error = curl_error($ch);
    curl_close($ch);

    if ($error) {
        return ['code' => 0, 'error' => $error, 'http_code' => $httpCode];
    }
    return ['code' => $httpCode, 'data' => json_decode($response, true), 'raw' => $response];
}

調用示例

$payload = [
    'ccode'    => '12345o61sd4d67w',
    'ddate'    => '2015-12-16',
    'ccuscode' => '0100001',
    'cinvcode' => '100101',
    'iquantity'=> '1',
    'address'  => '測試地址',
    'cmemo'    => '無',
    'cmaker'   => 'demo',
    'cverifer' => 'demo',
    'dpredate' => '2015-12-17',
    'imoney'   => '1',
];

$url = 'https://61.153.225.106:5678/Service.asmx/WriteSomain';
$result = httpPostJson($url, $payload);

if ($result['code'] === 200) {
    echo "成功: " . json_encode($result['data'], JSON_UNESCAPED_UNICODE);
} else {
    echo "失敗 HTTP {$result['code']}: " . ($result['error'] ?? $result['raw']);
}

關鍵參數解析

選項作用注意
CURLOPT_RETURNTRANSFERcurl_exec 返回字符串而非直接輸出必須設置 true
CURLOPT_POSTFIELDS發送的 JSON 字符串需先 json_encode
Content-Type告知服務端負載格式application/json; charset=utf-8
CURLOPT_SSL_VERIFYPEER驗證 SSL 證書生產環境必須 true 並配置 CA 憑證
CURLOPT_TIMEOUT整個請求最大秒數防止掛死

常見問題排查

  1. 返回 false/空:檢查 curl_error($ch),常見「Connection refused」「Operation timed out」「SSL certificate problem」。
  2. 服務端收到空數據:確認 Content-Type 標頭正確,部分框架需 php://input 讀取原始體。
  3. 中文亂碼:json_encode($data, JSON_UNESCAPED_UNICODE) + 標頭 charset=utf-8。
  4. 大數據發送:超過 1MB 建議啟用 CURLOPT_POSTFIELDSIZE 或分塊上傳。

進階:重試與熔斷封裝

function httpPostJsonWithRetry(string $url, array $data, int $maxRetries = 3): array {
    for ($i = 0; $i < $maxRetries; $i++) {
        $result = httpPostJson($url, $data);
        if ($result['code'] === 200 || $result['code'] >= 400 && $result['code'] < 500) {
            return $result; // 成功或客戶端錯誤不重試
        }
        sleep(pow(2, $i)); // 指數退避 1s, 2s, 4s
    }
    return ['code' => 0, 'error' => 'Max retries exceeded'];
}

總結

關鍵三點:**json_encode 編碼**、**設置正確 HTTP Header**、**啟用 RETURNTRANSFER 獲取響應**。生產環境務必開啟 SSL 驗證並配置超時重試策略。

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