2

PHP で REST サービスとクライアントをセットアップしましたが、PUT に少し問題があります。

私の状況は次のとおりです。データの配列と画像を受け入れる REST リソースをコーディングしています。REST リソースは既存のレコードを更新する必要があるため、PUT を使用しています。私が書いたPHP curlクライアントでデータを送信しています。つまり、ファイルのアップロードを行い、追加の POST フィールドを受け入れる PHP スクリプトに HTML マルチパート フォームを送信する場合とほぼ同じ状況です。ただし、PUT と PHP curl を除きます。

今まで、私は次のような PUT リクエストを送信してきました (疑似コード):

$a_some_data = array('name' => 'test', 'user_id' => 4);
$body = http_build_query($a_data);

$fh = fopen('php://memory', 'rw');
fwrite($body);
rewind($fh);

$ch = curl_init();
curl_setopt_array($ch, array(
  CURLOPT_URL => 'http://myapi/resource/someid',
  CURLOPT_PUT => TRUE,
  CURLOPT_INFILE => $fh,
  CURLOPT_INFILESIZE => strlen($body)
  ));
curl_exec($ch);

サーバー上のデータを次のように読み取ります。

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

..これは問題なく動作します。

そこで、(バイナリ) ファイルをミックスに追加したいと思います。- クライアント側でこれをどのように実装しますか? - サーバー上のファイルをどのように処理しますか?

テストのために、ファイル入力を使用して HTML フォームをセットアップし、それが送信する生の multipart/form-data リクエストをコピーし、PUT リクエストで curl を使用してそのデータをファイルとして送信しようとしました。そのようなものは機能しますが、サーバー上の生データを手動で解析する必要があります。これが最善のアイデアかどうかはわかりません。または、ファイルを PUT リクエストの本文として送信し、URL に他のパラメーターをクエリ文字列として追加することもできると思いますが、それは PUT REST リソースの要点に反していると思います..

これについてあなたの考えを共有してください。ありがとう!

4

1 に答える 1

3

元のバージョンが十分でない場合を除き、他に少なくとも 2 つの方法があります (libcurl はそのスクリプトを使用してバイナリ ファイルも問題なく処理できるため)。受信側で PUT を受信する方法は curl の問題ではないため、この応答から除外します。

1-あなたが始めたように、CURLOPT_READFUNCTIONを提供して、データをlibcurlに送り、それを送信します。

2 - CURLOPT_POSTFIELDS (文字列付き) を使用して POST のように見せてから、CURLOPT_CUSTOMREQUEST を使用して HTTP メソッドを「PUT」に変更します。

于 2011-03-29T17:50:11.783 に答える