24

- 質問 -

私はRESTAPIを使い始めたばかりで、かなり混乱しています。

これは、私のPHPcRULクライアント側がPUTに対してどのように見えるかです。

case 'PUT':
    curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT');
    curl_setopt($handle, CURLOPT_POSTFIELDS, $data);
    break;

サーバーを見ると、$ _ SERVER ['REQUEST_METHOD']にPUTが表示されていますが、質問は、CURLOPT_POSTFIELDSで送信した$dataを取得する方法です。

私がする必要があるのは、PUTリクエストで送信された$dataを次の行に取得することだけです。好き

$value = $data['curl_data'];

私はこのトピックについて非常に多くの混乱を見てきましたので、それは私に頭痛の種を与えています。phpクライアント側ではとても簡単に思えますが、phpサーバー側で機能している答えは誰にもありません。

助けてくれてありがとう!

-回答(ヘルプと宿題の後)-

私は新しいので、8時間後まで自分の質問に答えることができません...奇妙な:)

さて、ここで素晴らしい人々と仕事をした後、私たちは答えに出くわしたと言わなければなりません。私はそれがとても簡単であると同時にそれが混乱していたことで自分自身を蹴っています。

curl_setopt($handle, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($handle, CURLOPT_POSTFIELDS, http_build_query($data));

最初の変更(上記)では、$ dataの周りにhttp_build_query()を追加する必要がありました。これにより、データが配列からURLに適した文字列になりました。

次は追加しなければなりませんでした。

parse_str(file_get_contents('php://input'), $put);

これで、$put['data']のようなことができます。

PaulPROが上記で示した答えは、file_get_contents()がより少ない行で行ったのと同じ方法でデータを取得するために機能します。別のサイトで見たhttp_build_query()の欠如が影響を及ぼした場所で、データを解析する方法を見つけようとして立ち往生しました。

これがすべての仕組みです。

  1. データは通常の配列に入れられます。
  2. http_build_query()は、それをほぼGETのような文字列に変換します。
  3. file_get_contents()は、それをクライアントからサーバーに転送します。
  4. 次に、parse_str()はそれを配列に戻します。

PUTを使用してファイルを送信することについて多くのメッセージが表示されます。これがどのように機能するかはわかりますが、このRESTプロセス全体で読んだことから、PUTはデータを更新し、postはデータを作成するということでした。多分私は間違っています。私は何かが足りないのですか?

4

3 に答える 3

14

PHPマニュアルから:

PUTデータはstdinから取得されます。

$putdatafp = fopen("php://input", "r");

使用例:

$putfp = fopen('php://input', 'r');
$putdata = '';
while($data = fread($putfp, 1024))
    $putdata .= $data;
fclose($putfp);
于 2011-07-24T07:48:43.700 に答える
11

同じシナリオで、PUTメソッドを使用してReSTAPIを介してPHPサーバーにデータを送信する必要があります。私は解決策を見つけるのにほぼ数時間苦労しましたが、最終的に方法を見つけました:

CUrlで:

$postData = http_build_query($data);
curl_setopt($ch, CURLOPT_POSTFIELDS,$postData); 

データを変数に解析する必要があります。たとえば、$ putData、ここに文字列の解析プロシージャがあります。

parse_str(file_get_contents("php://input"),$putData); 

次に、を印刷する$putDataと、curlに投稿しているのと同じ配列が取得されます。

于 2015-04-02T11:16:02.973 に答える
2

$_POSTのようなキー値を持つフォームデータを取得したい場合。

function PUT(string $name):string{

    $lines = file('php://input');
    $keyLinePrefix = 'Content-Disposition: form-data; name="';

    $PUT = [];
    $findLineNum = null;

    foreach($lines as $num => $line){
        if(strpos($line, $keyLinePrefix) !== false){
            if($findLineNum){ break; }
            if($name !== substr($line, 38, -3)){ continue; }
            $findLineNum = $num;
        } else if($findLineNum){
            $PUT[] = $line;
        }
    }

    array_shift($PUT);
    array_pop($PUT);

    return mb_substr(implode('', $PUT), 0, -2, 'UTF-8');

}

たとえば、rest-api.php

$title = PUT('title');
于 2020-10-18T02:29:49.000 に答える