PHPでREST APIを呼び出す


317

私たちのクライアントは、PHP呼び出しを行う必要があるREST APIを私にくれました。しかし、実際のところ、APIで提供されるドキュメントは非常に限られているため、サービスの呼び出し方法がわかりません。

私はそれをグーグルにしようとしました、しかし現れた唯一のものはすでに期限切れのYahoo!でした。サービスの呼び出し方法に関するチュートリアル。ヘッダーや詳細情報については触れません。

REST APIの呼び出し方法に関する適切な情報、またはREST APIに関するドキュメントはありますか?W3schoolsでも、SOAPメソッドについてのみ説明しているためです。PHPでREST APIを作成するためのさまざまなオプションは何ですか?

回答:


438

PHP cURL拡張機能を使用して、任意のREST APIにアクセスできます。ただし、APIドキュメント(メソッド、パラメーターなど)はクライアントから提供する必要があります。

例:

// Method: POST, PUT, GET etc
// Data: array("param" => "value") ==> index.php?param=value

function CallAPI($method, $url, $data = false)
{
    $curl = curl_init();

    switch ($method)
    {
        case "POST":
            curl_setopt($curl, CURLOPT_POST, 1);

            if ($data)
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            break;
        case "PUT":
            curl_setopt($curl, CURLOPT_PUT, 1);
            break;
        default:
            if ($data)
                $url = sprintf("%s?%s", $url, http_build_query($data));
    }

    // Optional Authentication:
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($curl, CURLOPT_USERPWD, "username:password");

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($curl);

    curl_close($curl);

    return $result;
}

1
@Michiel:HTTPリクエストメソッド(GET、POST、PUTなど)。APIに応じて、必要なさまざまなメソッドがあります。つまり、読み取りはGET、書き込みはPOSTです。
Christoph Winkler

2
@Michiel $dataは、apiメソッドに送信されるデータを保持する連想配列(data [fieldname] = value)です。
Christoph Winkler

1
多大なご協力ありがとうございます!
ミシエル

2
curl_close関数が呼び出されないことに注意してください。CallAPI関数が繰り返し呼び出されると、メモリが余分に消費される可能性があります。
Bart Verkoeijen 14

1
以下の@colanからの答えははるかに優れています-独自のエラー処理とラッパーメソッドを構築する手間を省きます。
Andreas

186

URLがあり、PHPがそれをサポートしている場合は、file_get_contentsを呼び出すだけです。

$response = file_get_contents('http://example.com/path/to/api/call?param1=5');

$ responseがJSONの場合、json_decodeを使用してそれをphp配列に変換します。

$response = json_decode($response);

$ responseがXMLの場合は、simple_xmlクラスを使用します。

$response = new SimpleXMLElement($response);

http://sg2.php.net/manual/en/simplexml.examples-basic.php


30
RESTエンドポイントがHTTPエラーステータス(例:401)file_get_contentsを返す場合、関数は警告で失敗し、nullを返します。本文にエラーメッセージが含まれている場合は、取得できません。
Bart Verkoeijen 14

3
その主な欠点は、URLにアクセスするために、PHPインストールでfopenラッパーを有効にする必要があることです。fopenラッパーが有効になっていない場合、Webサービス要求にfile_get_contentsを使用できません。
Oriol

2
fopenラッパーは、現在PHPの一部として脆弱性と見なされているため、一部のホストがそれを無効にしているのを目にする可能性があります。
マーカスダウニング

153

Guzzleを使用します。これは、「HTTP / 1.1での作業を容易にし、Webサービスの消費を軽減するPHP HTTPクライアント」です。Guzzleでの作業は、cURLでの作業よりもはるかに簡単です。

これはWebサイトの例です。

$client = new GuzzleHttp\Client();
$res = $client->get('https://api.github.com/user', [
    'auth' =>  ['user', 'pass']
]);
echo $res->getStatusCode();           // 200
echo $res->getHeader('content-type'); // 'application/json; charset=utf8'
echo $res->getBody();                 // {"type":"User"...'
var_export($res->json());             // Outputs the JSON decoded data

20
まだcURLを使用している人は、このオプションを詳しく調べたことはありません。
JoshuaDavid 2015

いい感じ。しかし、PNGのフェッチについてはどうでしょうか?マップタイル用。リンクしたウェブページで言及されているJSONデータのみが見つかります。
Henrik Erlandsson 2018年

20

CURLが最も簡単な方法です。これは簡単な呼び出しです

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "THE URL TO THE SERVICE");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, POST DATA);
$result = curl_exec($ch);


print_r($result);
curl_close($ch);

1
まあ@ erm3nda OPは「サービスの呼び出し方法が本当にわからない」と言っています。RESTAPIを使用するための最良の方法を教えてください。
ブロンチャ2014

4
うわー、あなたのコメントを良くするために皮肉な返事をする代わりにあなたの努力と時間を無駄にしてください。そのように頑張ってください。
m3nda 2014

2
これがいかにシンプルか大好きです。
継続

@Sadik POST DATAは単なるプレースホルダーです。投稿データをそこに送信する必要があります
ブロンチャ

12

HTTPFULを使用する

Httpfulは、HTTPを正常に話すことを目的とした、シンプルでチェーン化された読み取り可能なPHPライブラリです。これにより、開発者はcurl set_optページをふるいにかける代わりにAPIとの対話に集中でき、理想的なPHP RESTクライアントです。

Httpfulに含まれるもの...

  • 読み取り可能なHTTPメソッドのサポート(GET、PUT、POST、DELETE、HEAD、およびOPTIONS)
  • カスタムヘッダー
  • 自動「スマート」解析
  • 自動ペイロードのシリアル化
  • 基本認証
  • クライアント側の証明書認証
  • 「テンプレート」のリクエスト

GETリクエストを送信します。自動的に解析されたJSON応答を取得します。

ライブラリは、応答内のJSON Content-Typeを認識し、応答を自動的に解析してネイティブPHPオブジェクトにします。

$uri = "https://www.googleapis.com/freebase/v1/mqlread?query=%7B%22type%22:%22/music/artist%22%2C%22name%22:%22The%20Dead%20Weather%22%2C%22album%22:%5B%5D%7D";
$response = \Httpful\Request::get($uri)->send();

echo 'The Dead Weather has ' . count($response->body->result->album) . " albums.\n";

私はHTTPFULをソリューションとして使用しようとし$condition = $response->weather[0]->main;ていますが、PHP側を間違って実行しているのでない限り、JSONを解析できるかどうか
わかりませ

9

呼び出すREST APIがGETまたはPOST、または両方のメソッドをサポートしているかどうかを知る必要があります。以下のコードは私にとってはうまくいくものです。私は自分のWebサービスAPIを呼び出しているので、APIが何を取得し、何を返すかはすでに知っています。GETPOSTメソッドの両方をサポートしているため、機密性の低い情報がにURL (GET)入力され、ユーザー名やパスワードなどの情報がPOST変数として送信されます。また、すべてがHTTPS接続を経由します。

APIコード内で、返したい配列をjson形式にエンコードし、PHPコマンドecho $my_json_variableを使用して、そのjson文字列をクライアントで使用できるようにします。

ご覧のとおり、私のAPIはjsonデータを返しますが、APIからの応答の形式を知る(または、返されたデータを調べて調べる)必要があります。

これは、クライアント側からAPIに接続する方法です。

$processed = FALSE;
$ERROR_MESSAGE = '';

// ************* Call API:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.myapi.com/api.php?format=json&action=subscribe&email=" . $email_to_subscribe);
curl_setopt($ch, CURLOPT_POST, 1);// set post data to true
curl_setopt($ch, CURLOPT_POSTFIELDS,"username=myname&password=mypass");   // post data
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
curl_close ($ch);

// returned json string will look like this: {"code":1,"data":"OK"}
// "code" may contain an error code and "data" may contain error string instead of "OK"
$obj = json_decode($json);

if ($obj->{'code'} == '1')
{
  $processed = TRUE;
}else{
  $ERROR_MESSAGE = $obj->{'data'};
}

...

if (!$processed && $ERROR_MESSAGE != '') {
    echo $ERROR_MESSAGE;
}

ところで、私はfile_get_contents()ここで一部のユーザーが提案したようにメソッドも使用しようとしましたが、それは私にはうまくいきません。私はこのcurl方法がより速く、より信頼できることがわかりました。


5

実際にたくさんのクライアントがいます。それらの1つはペストです -これをチェックしてください。また、これらのREST呼び出しは、GET、POST、PUT、DELETEなどのさまざまなメソッドを使用した単純なhttpリクエストであることに注意してください。


4

関数名file_get_contentsからわかるようにPOST/PUT/DELETE/OPTIONS/HEADGETメソッドに加えて、任意のhttp メソッドを発行できます。

file_get_contentsを使用してPHPでデータを投稿する方法は?


1
file_get_contentは、APIに関しては非常に悪い考えです。stackoverflow.com/questions/13004805/…file_get_contents_curlのようなカスタムメソッドを設定して、プレーンなphpソリューションの代わりに使用できます。stackoverflow.com/questions/8540800/...
ErykWróbel

3

Symfonyを使用している場合、〜100の例外をすべて含み、意味のないエラーコード+メッセージを返す代わりに例外をスローする、優れたRESTクライアントバンドルがあります。

あなたは本当にそれをチェックする必要がありますhttps : //github.com/CircleOfNice/CiRestClientBundle

私はインターフェースが大好きです:

try {
    $restClient = new RestClient();
    $response   = $restClient->get('http://www.someUrl.com');
    $statusCode = $response->getStatusCode();
    $content    = $response->getContent();
} catch(OperationTimedOutException $e) {
    // do something
}

すべてのhttpメソッドで機能します。


2

@Christoph Winklerが言及したように、これはそれを達成するための基本クラスです:

curl_helper.php

// This class has all the necessary code for making API calls thru curl library

class CurlHelper {

// This method will perform an action/method thru HTTP/API calls
// Parameter description:
// Method= POST, PUT, GET etc
// Data= array("param" => "value") ==> index.php?param=value
public static function perform_http_request($method, $url, $data = false)
{
    $curl = curl_init();

    switch ($method)
    {
        case "POST":
            curl_setopt($curl, CURLOPT_POST, 1);

            if ($data)
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            break;
        case "PUT":
            curl_setopt($curl, CURLOPT_PUT, 1);
            break;
        default:
            if ($data)
                $url = sprintf("%s?%s", $url, http_build_query($data));
    }

    // Optional Authentication:
    //curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    //curl_setopt($curl, CURLOPT_USERPWD, "username:password");

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($curl);

    curl_close($curl);

    return $result;
}

}

次に、いつでもファイルを含めて使用できます。例:any.php

    require_once("curl_helper.php");
    ...
    $action = "GET";
    $url = "api.server.com/model"
    echo "Trying to reach ...";
    echo $url;
    $parameters = array("param" => "value");
    $result = CurlHelper::perform_http_request($action, $url, $parameters);
    echo print_r($result)

0

サードパーティのツールを使用できる場合は、https//github.com/CircleOfNice/DoctrineRestDriverをご覧ください。

これは、APIを操作するためのまったく新しい方法です。

最初に、着信データと発信データの構造を定義するエンティティを定義し、データソースで注釈を付けます。

/*
 * @Entity
 * @DataSource\Select("http://www.myApi.com/products/{id}")
 * @DataSource\Insert("http://www.myApi.com/products")
 * @DataSource\Select("http://www.myApi.com/products/update/{id}")
 * @DataSource\Fetch("http://www.myApi.com/products")
 * @DataSource\Delete("http://www.myApi.com/products/delete/{id}")
 */
class Product {
    private $name;

    public function setName($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

これで、REST APIとの通信が非常に簡単になりました。

$product = new Product();
$product->setName('test');
// sends an API request POST http://www.myApi.com/products ...
$em->persist($product);
$em->flush();

$product->setName('newName');
// sends an API request UPDATE http://www.myApi.com/products/update/1 ...
$em->flush();

-1

APIを簡単にするアプリケーションであるPOSTMANを使用できます。リクエストフィールドに入力すると、さまざまな言語でコードが生成されます。右側のコードをクリックして、ご希望の言語を選択してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.