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

PHP 模擬處理 HTTP PUT 請求:$_PUT 實作與 multipart/form-data 限制說明

     編輯:PHP 綜合知識

PHP 原生提供 $_GET、$_POST 超全域變數,但沒有 $_PUT。處理 RESTful API 的 PUT 請求時,需自行解析原始輸入流。

基本實作:解析 application/x-www-form-urlencoded

<?php
$_PUT = [];
if ($_SERVER['REQUEST_METHOD'] === 'PUT') {
    parse_str(file_get_contents('php://input'), $_PUT);
}
// 使用:$_PUT['id'], $_PUT['title']
  • php://input 讀取原始請求主體
  • parse_str() 解析查詢字串格式

關鍵限制:multipart/form-data 無法取得原始資料

當 Content-Type: multipart/form-data(檔案上傳)時:

  • PHP 自動解析並填入 $_FILES、$_POST
  • php://input 為空,無法讀取原始資料
  • 此時無法用上述方法模擬 $_PUT

變通方案(僅供測試/示範)

Apache mod_headers 強制改寫 Content-Type:

<Location "/demo.php">
    RequestHeader set Content-Type foobar
</Location>

將 Content-Type 改為非 multipart/form-data,php://input 即會有資料,但 $_FILES 會消失。生產環境不可用。

正規解決方案

場景建議做法
純資料更新(JSON/表單)Client 發送 Content-Type: application/json 或 application/x-www-form-urlencoded,Server 端 php://input + json_decode()/parse_str()
檔案上傳使用 POST + _method=PUT 偽裝,或改用 POST 語義上傳,PUT 僅用於資源更新
需原始 multipart 解析使用 PEAR HTTP_Request2_MultipartBody 或手寫解析器(複雜,不推薦)

cURL 測試 PUT 請求

# 表單格式
curl -X PUT https://domain.com/api/item -d "id=1" -d "title=test"

# JSON 格式
curl -X PUT https://domain.com/api/item \
  -H "Content-Type: application/json" \
  -d '{"id":1,"title":"test"}'

現代框架支援

  • Laravel:Request::input() 自動處理 PUT/PATCH/DELETE
  • Symfony:Request::createFromGlobals() 內建支援
  • Slim/ThinkPHP 5+:內建 Request::put() 方法

若維護舊專案需自行實作,建議封裝為 Middleware/Filter 統一處理,並明確文檔說明不支援 multipart PUT。

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