2012-10-27 135 views
4

我試圖使用$ HTTP_RAW_POST_DATA將原始POST數據發送到頁面,但是我的嘗試失敗並給出了未定義的索引通知。如何使用cURL發送原始POST數據? (PHP)

我已經嘗試以下操作:在請求,沒有不包括:(text/plain的的Content-Type)

curl_setopt($handle, CURLOPT_POSTFIELDS, 'Raw POST data'); // Doesn't seem to work at all. 
curl_setopt($handle, CURLOPT_POSTFIELDS, array('Raw POST data')); // 0 => Raw POST data 

我做了一些研究和一些人曾建議發送頭似乎影響任何東西。

如果有人能夠爲這個問題提供解決方案,我將不勝感激。謝謝!

回答

1

由於一些奇怪的原因,上述標題似乎解決了它,以前它不工作,我不確定它爲什麼現在可以工作。 不管怎麼說,對於那些不知道這是誰的代碼:

curl_setopt($handle, CURLOPT_HTTPHEADER, array('Content-Type: text/plain')); 
4

您在發件人/收件人週期的回覆部分中收到錯誤。

雖然這很可能是在發件人(不發送一個適當的請求)的問題,也可以通過在接收 PHP腳本配置錯誤引起的。即使請求是正確的,接收方可能仍然沒有HTTP_RAW_POST_DATA可用。

請參見:http://www.php.net/manual/en/ini.core.php#ini.always-populate-raw-post-data

總是產生$ HTTP_RAW_POST_DATA包含有原始的POST數據。 否則,該變量僅填充數據的無法識別的MIME類型 。但是,訪問原始POST 數據的首選方法是php://輸入。 $ HTTP_RAW_POST_DATA不適用於 enctype =「multipart/form-data」。

所以要檢查的第一件事就是$HTTP_RAW_POST_DATA是否確實填充,從網頁上面要求之一:

  1. 在.ini變量always_populate_raw_post_data爲True,
  2. 或POST與發送一個Content-Type POST處理程序無法識別(也許人們可以使用「text/raw」)

此時,發送數據的正確方法是

curl_setopt($handle, CURLOPT_POSTFIELDS, urlencode('Raw POST data')); 

但是請注意,接收這些數據將不依賴於$HTTP_RAW_POST_DATA所有,但讀取虛擬文件php://input內容的推薦方式。

php://輸入是一個只讀流,允許您從請求主體讀取原始數據 。在POST請求的情況下,最好 使用php://輸入,而不是$HTTP_RAW_POST_DATA,因爲它不依賴於特殊的php.ini指令,因此不會使用 。而且,對於默認情況下未填充 $ HTTP_RAW_POST_DATA的情況,這是潛在的 較少的內存密集型替代方式,以激活 always_populate_raw_post_data。

+0

我相當肯定的接收器工作正常(使用Live HTTP頭添加爲Firefox)的罰款,手動發送POST數據。 我知道php://輸入以及它如何更好,但是,在這種情況下,我需要$ HTTP_RAW_POST_DATA的解決方案。 謝謝你的回覆! – user1488335

+0

那麼,在這種情況下,您可以在PHP.INI中設置always-populate-raw-post-data設置;或者你可以發送一個「無法識別的」(無論*表示*)「MIME類型」來強制使用'$ HTTP_RAW_POST_DATA'。更新答案... – LSerni

+0

這個答案似乎與原始問題無關,這個問題實際上是關於使用PHP中的libcurl執行HTTP請求,而不是訪問發送給運行在Web服務器中的PHP腳本的POST數據。 – Shadocko