萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 模擬表單 POST 提交完整範例

前言

在後端開發中,常需模擬瀏覽器表單提交以串接第三方 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;
?>

關鍵細節說明

  • Header 終止:Header 區塊必須以雙 CRLF (\r\n\r\n) 結束,否則伺服器無法正確解析請求主體。
  • Microsoft IIS 相容性:註解提醒若目標為 IIS,可能需將換行符從 \n 改為 \r\n,因 IIS 嚴格遵循 HTTP 標準。
  • 錯誤處理:使用 @fsockopen 抑制警告,並回傳錯誤代碼供上層判斷。
  • 資料編碼:呼叫端需自行將陣列轉為 application/x-www-form-urlencoded 格式字串(可用 http_build_query())。

現代替代方案

PHP 5.5+ 內建 HttpRequest 類別,PHP 7+ 推薦使用 Guzzle 或 cURL 擴充套件,功能更完善且支援 HTTPS、並發請求等進階特性。本範例適合舊版環境或教學參考。

copyright © 萬盛學電腦網 all rights reserved