web-dev-qa-db-ja.com

CurlとPHP-PUT、POST、GETでcurlを介してjsonを渡す方法

私はそれの地獄のためにREST APIを構築することに取り組んでおり、CRUDにとって非常に簡単なコマンドラインからcurlを使用して、それをテストしてきました

コマンドラインからこれらの呼び出しを正常に行うことができます

curl -u username:pass -X GET http://api.mysite.com/pet/1
curl -d '{"dog":"tall"}' -u username:pass -X GET http://api.mysite.com/pet
curl -d '{"dog":"short"}' -u username:pass -X POST http://api.mysite.com/pet
curl -d '{"dog":"tall"}' -u username:pass -X PUT http://api.mysite.com/pet/1

上記の呼び出しはコマンドラインから簡単に作成でき、APIで正常に動作しますが、今ではPHPを使用してcurlを作成したいと思います。ご覧のとおり、データをJSON文字列として渡します。読み返しましたが、おそらくPOSTを実行してPOSTフィールドを含めることができると思いますが、GETでHTTP本文データを渡す方法を見つけることができませんでした。私が見るすべてはあなたがそれをURLに添付する必要があると言っていますが、それはコマンドラインフォームでそのように見えません。いずれにせよ、誰かがこれらの4つの操作を行う正しい方法をここの1ページにPHPで書くことができればそれが大好きです。 curlとphpでそれを行う最も簡単な方法が見たいです。私のphp APIはphp:// inputですべてをキャッチするので、httpボディを介してすべてを渡す必要があると思います

52
Gilberg

PUT

$data = array('username'=>'dog','password'=>'tall');
$data_json = json_encode($data);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json','Content-Length: ' . strlen($data_json)));
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS,$data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response  = curl_exec($ch);
curl_close($ch);

投稿

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response  = curl_exec($ch);
curl_close($ch);

GET @Dan Hの回答を参照

DELETE

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
curl_setopt($ch, CURLOPT_POSTFIELDS,$data_json);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response  = curl_exec($ch);
curl_close($ch);
145
voodoo417

この小さなライブラリを使用できます: https://github.com/jmoraleda/php-rest-curl

電話をかけるのは簡単です:

// GET
$result = RestCurl::get($URL, array('id' => 12345678));

// POST
$result = RestCurl::post($URL, array('name' => 'John'));

// PUT
$result = RestCurl::put($URL, array('$set' => array('lastName' => "Smith")));

// DELETE
$result = RestCurl::delete($URL); 

そして、$ result変数の場合:

  • $ result ['status']はHTTP応答コードです
  • $ result ['data'] JSON応答が解析された配列
  • $ result ['header']応答ヘッダーを含む文字列

それが役に立てば幸い

11
ledfusion

私自身は、URLでエンコードし、リンク先ページで$ _GETを使用します。例として1行を示します。

$ch = curl_init();
$this->json->p->method = "whatever";
curl_setopt($ch, CURLOPT_URL, "http://" . $_SERVER['SERVER_NAME'] . $this->json->path . '?json=' . urlencode(json_encode($this->json->p)));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);

編集:宛先スニペットの追加...(編集2はOPリクエストで上記に追加されました)

<?php
if(!isset($_GET['json']))
    die("FAILURE");
$json = json_decode($_GET['json']);
$method = $json->method;
...
?>
5
Dan H

私は Elastic SQLプラグイン で作業していました。クエリは、以下のようにcURLを使用してGETメソッドで実行されます。

curl -XGET http://localhost:9200/_sql/_explain -H 'Content-Type: application/json' \
-d 'SELECT city.keyword as city FROM routes group by city.keyword order by city'

パブリックサーバーでカスタムポートを公開し、基本認証を設定してリバースプロキシを実行しました。

このコードは、基本認証ヘッダーに加えて正常に機能します。

$Host = 'http://myhost.com:9200';
$uri = "/_sql/_explain";
$auth = "john:doe";
$data = "SELECT city.keyword as city FROM routes group by city.keyword order by city";

function restCurl($Host, $uri, $data = null, $auth = null, $method = 'DELETE'){
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $Host.$uri);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    if ($method == 'POST')
        curl_setopt($ch, CURLOPT_POST, 1);
    if ($auth)
        curl_setopt($ch, CURLOPT_USERPWD, $auth);
    if (strlen($data) > 0)
        curl_setopt($ch, CURLOPT_POSTFIELDS,$data);

    $resp  = curl_exec($ch);
    if(!$resp){
        $resp = (json_encode(array(array("error" => curl_error($ch), "code" => curl_errno($ch)))));
    }   
    curl_close($ch);
    return $resp;
}

$resp = restCurl($Host, $uri); //DELETE
$resp = restCurl($Host, $uri, $data, $auth, 'GET'); //GET
$resp = restCurl($Host, $uri, $data, $auth, 'POST'); //POST
$resp = restCurl($Host, $uri, $data, $auth, 'PUT'); //PUT
0
Luiz Vaz