3

REST API と PHP/cURL を使用していくつかのカスタム フィールドを更新しようとしています。

下にあるものは昨日「機能した」(と思う)のに、気付かずに何かを編集したのではないかと思っていますが、現在は機能していません。

以下から、さまざまな「方法」を使用してさまざまな応答を取得します。

  1. 以下でコメント解除されているため、POST メソッドを使用してこれを取得します。

    HTTP 405 - 指定された HTTP メソッドは、要求されたリソース () に対して許可されていません。

  2. POST をコメントアウトして、コメントアウトした PUT メソッドを使用すると、これが得られます。

    {"status-code":500,"message":"Read timed out"}
    
  3. そして、これは PUT と POST を組み合わせて組み合わせたものです。

    {"errorMessages":["No content to map to Object due to end of input"]}
    

私は何が欠けていますか/間違っていますか? 次のコードを使用しています。

<?php

$username = 'username';
$password = 'password';

$url = "https://example.com/rest/api/2/issue/PROJ-827";
$ch = curl_init();

$headers = array(
    'Accept: application/json',
    'Content-Type: application/json'
);

$test = "This is the content of the custom field.";

$data = <<<JSON
{
    "fields": {
        "customfield_11334" : ["$test"]
    }
}
JSON;

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// Also tried, with the above two lines commented out...
// curl_setopt($ch, CURLOPT_PUT, 1);
// curl_setopt($ch, CURLOPT_INFILE, $data);
// curl_setopt($ch, CURLOPT_INFILESIZE, strlen($data));
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");

$result = curl_exec($ch);
$ch_error = curl_error($ch);

if ($ch_error) {
    echo "cURL Error: $ch_error";
} else {
    echo $result;
}

curl_close($ch);

?> 
4

1 に答える 1

8

ここでの問題は、PHP の cURL API が特に直感的ではないことです。

POST リクエストの本文が次のオプションを使用して送信されるため、PUT リクエストも同じように行われると考えるかもしれません。

// works for sending a POST request
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

// DOES NOT work to send a PUT request
curl_setopt($ch, CURLOPT_PUT, 1);
curl_setopt($ch, CURLOPT_PUTFIELDS, $data);

代わりに、PUT リクエスト (関連する本体データを含む) を送信するには、次のものが必要です。

// The correct way to send a PUT request
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

PUT リクエストを送信している場合でも、オプションを使用しCURLOPT_POSTFIELDS て PUT リクエスト本文を送信する必要があることに注意してください。これは紛らわしく、一貫性のないプロセスですが、PHP cURL バインディングを使用したい場合は、このプロセスを利用できます。

関連する手動入力docsによると、このCURLOPT_PUTオプションはファイルを直接 PUT する場合にのみ機能するようです。

ファイルを HTTP PUT する場合は TRUE。PUT するファイルは、CURLOPT_INFILE および CURLOPT_INFILESIZE で設定する必要があります。

私見のより良いオプションは、HTTP クライアント操作にカスタム ストリーム ラッパーを使用することです。これには、アプリケーションが基盤となる libcurl ライブラリに依存しないという追加の利点があります。ただし、そのような実装は、この質問の範囲を超えています。ストリーム ラッパー ソリューションの開発に興味がある場合は、Google があなたの味方です。

于 2012-07-29T19:46:33.550 に答える