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

PHP cURL 模擬 POST 請求完整範例:支援 Header 自定義與編碼轉換

     編輯:PHP 綜合知識

核心封裝函數

<?php
header("Content-type: text/html; charset=utf-8");

/**
 * cURL POST 請求封裝
 * @param array $header HTTP 標頭陣列
 * @param string $data POST 數據(application/x-www-form-urlencoded 格式)
 * @param string $url 目標 URL
 * @return string|int 回應內容或 0(失敗)
 */
function curl_post($header, $data, $url)
{
    $ch = curl_init();
    
    $res = curl_setopt($ch, CURLOPT_URL, $url);
    var_dump($res); // 調試用,生產環境建議移除
    
    // SSL 設定(開發/測試環境常需關閉驗證)
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    
    curl_setopt($ch, CURLOPT_HEADER, 0);        // 不輸出回應 Header
    curl_setopt($ch, CURLOPT_POST, 1);          // POST 請求
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data); // POST 數據
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 返回字符串而非直接輸出
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header); // 自定義 Header
    
    $result = curl_exec($ch);
    curl_close($ch);
    
    if ($result === false || $result === null) {
        return 0;
    }
    return $result;
}

// 使用示例
$url = 'https://127.0.0.1';

$header = array(
    "Host: 127.0.0.1",
    "Content-Type: application/x-www-form-urlencoded",
    'Referer: https://127.0.0.1/toolindex.xhtml',
    'User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2;)'
);

$data = 'tools_id=1&env=gamma';
echo "argv: $data<br>";

$ret = curl_post($header, $data, $url);

// 編碼轉換:假設服務端返回 GB2312,轉為 UTF-8 顯示
$utf8 = iconv('GB2312', 'UTF-8//IGNORE', $ret);
echo 'return:<br>' . nl2br($utf8) . '<br>';
?>

關鍵參數詳解

選項作用常用值
CURLOPT_URL請求目標地址字符串
CURLOPT_POST啟用 POST1 (true)
CURLOPT_POSTFIELDSPOST 數據字符串或陣列
CURLOPT_RETURNTRANSFER返回結果不直接輸出1 (true)
CURLOPT_HTTPHEADER自定義請求標頭陣列
CURLOPT_SSL_VERIFYPEER驗證 SSL 證書0 (關閉,測試用)
CURLOPT_TIMEOUT超時秒數整數(建議 30)
CURLOPT_FOLLOWLOCATION跟隨重定向1 (true)

進階用法提示

  • 發送 JSON:將 Content-Type 設為 application/json,$data = json_encode($arr)
  • 檔案上傳:PHP 5.5+ 使用 new CURLFile($path, $mime, $name);舊版用 @$path(已棄用)
  • 錯誤處理:用 curl_error($ch) 獲取錯誤信息,curl_getinfo($ch, CURLINFO_HTTP_CODE) 獲取 HTTP 狀態碼
  • 複用連接:長運行腳本中可保持 $ch 實例複用,減少握手開銷

常見問題排查

  1. 返回亂碼:確認服務端編碼,用 iconv 或 mb_convert_encoding 轉換
  2. SSL 錯誤:生產環境請配置 CA 證書路徑(CURLOPT_CAINFO),勿長期關閉驗證
  3. 空白回應:檢查 curl_error(),確認防火牆/代理設置,嘗試設定 CURLOPT_USERAGENT
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved