在後端開發中,常需模擬瀏覽器表單提交以串接第三方 API 或進行自動化測試。本文提供一個完整的 PHP 函式庫,透過 Socket 連線實作 HTTP POST 請求,支援自訂 Header 與資料編碼,相容 Microsoft IIS 等特殊平台需求。
<?php
/**
* 簡易 POST 發送類
* @author Andrus (andrus@vnet.ee)
* @version 1.0
*/
class HttpPostClient {
/**
* 發送標準瀏覽器 Header
*/
private function sendHeaders($fp) {
fputs($fp, "Accept: */* \r\n");
fputs($fp, "Accept-Language: en \r\n");
fputs($fp, "Connection: Keep-Alive \r\n");
fputs($fp, "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows 98) \r\n");
}
/**
* 執行 POST 請求並回傳回應
* @param string $host 目標主機
* @param string $url 請求路徑或完整 URL
* @param string $data POST 資料字串
* @return string 伺服器回應內容
*/
public function postData($host, $url, $data) {
$fp = @fsockopen($host, 80, $errno, $errstr, 120);
if (!$fp) {
return "Connection failed: $errstr ($errno)";
}
// 處理 URL 格式
if (strncasecmp($url, "https://", 7) === 0) {
$url = substr($url, 7);
}
$p = strpos($url, '/');
$req = $p === false ? '/' : substr($url, $p);
// 發送請求行與 Header
fputs($fp, "POST $req HTTP/1.0 \r\n");
$this->sendHeaders($fp);
fputs($fp, "Host: $host \r\n");
fputs($fp, "Content-Type: application/x-www-form-urlencoded \r\n");
fputs($fp, "Content-Length: " . strlen($data) . " \r\n\r\n");
fputs($fp, $data . "\r\n");
// 讀取回應
$response = '';
while (!feof($fp)) {
$response .= fgets($fp, 1024);
}
fclose($fp);
return $response;
}
}
// 使用範例
$client = new HttpPostClient();
$result = $client->postData('example.com', '/api/submit', 'field1=value1&field2=value2');
echo $result;
?>
\n 改為 \r\n,因 IIS 嚴格遵循 HTTP 標準。@fsockopen 抑制警告,並回傳錯誤代碼供上層判斷。application/x-www-form-urlencoded 格式字串(可用 http_build_query())。PHP 5.5+ 內建 HttpRequest 類別,PHP 7+ 推薦使用 Guzzle 或 cURL 擴充套件,功能更完善且支援 HTTPS、並發請求等進階特性。本範例適合舊版環境或教學參考。