PHP cURL 發送 JSON POST 請求完整指南
現代 API 交互多採用 JSON 格式,PHP cURL 需正確設置 Header 與資料編碼才能成功提交。
標準實作代碼
<?php
// 1. 準備資料並編碼為 JSON
$data = array("name" => "Hagrid", "age" => "36");
$data_string = json_encode($data);
// 2. 初始化 cURL
$ch = curl_init('https://api.local/rest/users');
// 3. 設置關鍵選項
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); // 請求方法
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); // JSON 資料
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 返回字串而非直接輸出
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json', // 關鍵:聲明 JSON 格式
'Content-Length: ' . strlen($data_string) // 可選:聲明內容長度
));
// 4. 執行請求
$result = curl_exec($ch);
// 5. 錯誤處理
if (curl_errno($ch)) {
echo 'cURL 錯誤: ' . curl_error($ch);
}
// 6. 關閉連線
curl_close($ch);
// 7. 處理回應
$response = json_decode($result, true);
print_r($response);
關鍵選項詳解
| 選項 | 說明 |
CURLOPT_CUSTOMREQUEST | 指定 HTTP 方法(POST/PUT/DELETE 等) |
CURLOPT_POSTFIELDS | 發送資料,JSON 字串需配合 Header |
CURLOPT_HTTPHEADER | 必須設置 Content-Type: application/json |
CURLOPT_RETURNTRANSFER | true 返回字串,false 直接輸出 |
CURLOPT_SSL_VERIFYPEER | HTTPS 時建議設 false(測試環境) |
常見錯誤與修正
❌ 錯誤:未設置 Content-Type
// 伺服器無法識別資料格式,返回 400/415
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
// 缺少 CURLOPT_HTTPHEADER 設置
❌ 錯誤:使用陣列而非 JSON 字串
// 會以 multipart/form-data 發送,非 JSON
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // 錯誤
// 正確
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
進階:封裝為可復用函數
function curl_post_json($url, $data, $headers = []) {
$ch = curl_init($url);
$default_headers = [
'Content-Type: application/json',
'Content-Length: ' . strlen($data)
];
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_POSTFIELDS => $data,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => array_merge($default_headers, $headers),
CURLOPT_TIMEOUT => 30,
CURLOPT_SSL_VERIFYPEER => false, // 僅測試環境
]);
$result = curl_exec($ch);
$error = curl_error($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return ['code' => $code, 'data' => $result, 'error' => $error];
}
// 使用
$json = json_encode(['name' => 'Test']);
$response = curl_post_json('https://api.example.com/endpoint', $json);
掌握此模式,即可輕松對接各類 RESTful API 服務。
- 上一篇文章: 基於 flush() 無法順序輸出的解決方案
- 下一篇文章: PHP 過濾頁面中的 BOM (Byte Order Mark) 實現代碼
Copyright ©
程式碼之家 All Rights Reserved