簡體   English   中英

PHP得到PUT請求體

[英]PHP get PUT request body

我目前正在用PHP開發Restful Json-API。 我想發送一個PUT-Request到items/:id來更新記錄。 數據將作為application/json傳輸。

我想用API調用API

curl -H "Content-Type: application/json" -X PUT -d '{"example" : "data"}' "http://localhost/items/someid"

在服務器端,我無法檢索請求正文。 我試過了

file_get_contents("php://input");

但這會返回一個空字符串。 fopen() / fread()組合也不起作用。

通過POST調用時,一切都很好,我可以在服務器端完美地讀取json。 但API不再是Restful了。 有人有解決方案嗎? 還有另一種發送和接收Json的方式嗎?

順便說一句,我正在使用Slim Framework開發API。

php://input只能讀取一次PUT請求:

注意:使用php://輸入打開的流只能讀取一次; 流不支持搜索操作。 但是,根據SAPI實現,可能會打開另一個php://輸入流並重新開始讀取。 只有在保存了請求正文數據后才能執行此操作。 通常,這是POST請求的情況,但不是其他請求方法,例如PUT或PROPFIND。

http://php.net/manual/en/wrappers.php.php

Slim框架已根據請求讀取數據。 從Request對象中獲取數據,並將其讀取到該對象中。

在服務器端,我無法檢索請求正文。 我試過file_get_contents(“php:// input”);

你只能使用file_get_contents( 'php://input', 'r' ); 每次請求一次。 檢索它的值也會截斷值,所以如果你調用它兩次,它將返回一個空字符串。 Slim的請求對象包含您需要的值,因此:

<?php
$app = new Slim( );

$app->put( '/items/someid', function () use ( $app ) {
    echo $app->request( )->put( 'example' ); // should display "data".
});

PHP手冊中的示例使用fopen以讀取模式訪問php://輸入。 你嘗試過這樣做嗎?

編輯: PHP手冊頁://說一些似乎暗示PUT數據可能在某些情況下不可用的東西!

注意:使用php://輸入打開的流只能讀取一次; 流不支持搜索操作。 但是,根據SAPI實現,可能會打開另一個php://輸入流並重新開始讀取。 只有在保存了請求正文數據后才能執行此操作。 通常,這是POST請求的情況,但不是其他請求方法,例如PUT或PROPFIND。

我不知道這將留下你關於PUT處理的地方。 一頁似乎說它是可能的,另一頁似乎暗示它不會在錯誤的環境下工作

我前幾天正在閱讀SLIM框架文檔,它說有些瀏覽器在PUT和DELETE方面存在問題。

摘抄:

不幸的是,現代瀏覽器不提供對PUT請求的本機支持。 要解決此限制,請確保HTML表單的方法是“post”,然后將方法覆蓋參數添加到HTML表單中,如下所示:

<form action="/books/1" method="post">
    ... other form fields here...
    <input type="hidden" name="_METHOD" value="PUT"/>
    <input type="submit" value="Update Book"/>
</form>

資料來源: http//www.slimframework.com/documentation/stable

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM