web-dev-qa-db-ja.com

を呼び出す REST API in PHP

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

私はそれをグーグルに試みたが、現われた唯一のものはすでに期限切れのヤフーだった!サービスを呼び出す方法に関するチュートリアル。ヘッダーやその他の詳細な情報について言及していません。

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

270
Michiel

PHPのcURLエクステンションを使えば、任意のREST AP​​Iにアクセスできます。ただし、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;
}
370

あなたが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

155
Andreas Wong

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
136
colan

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);
17
Broncha

_ httpful _ を使用

Httpfulはシンプルで連鎖可能で読みやすいPHPライブラリで、HTTPをより安全に話すためのものです。開発者は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";
10
Somnath Muluk

呼び出しているREST AP​​IがGETまたはPOST、あるいはその両方のメソッドをサポートしているかどうかを知る必要があります。以下のコードは私のために働くものです、私は私自身のWebサービスAPIを呼んでいます、それで私はすでにAPIがとるものとそれが返すものを知っています。これはGETメソッドとPOSTメソッドの両方をサポートしているので、機密性の低い情報がURL (GET)に入り、usernameやpasswordなどの情報が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メソッドがより速くより信頼できるものであることを知りました。

6
derekg

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

4
deadrunk

Symfonyを使っているのであれば、意味のないエラーコード+メッセージを返さずに、〜100個の例外をすべて含み、それらを投げるすばらしい休止クライアントバンドルがあります。

あなたは本当にそれをチェックする必要があります: 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メソッドに対して機能します。

3
Tobias

関数名が示すようにGETメソッドに加えて、任意のhttp file_get_contentsメソッドを発行するためにPOST/PUT/DELETE/OPTIONS/HEADを使用できます。

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

2
Chuan Ma

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

2
xhuljo

@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)
1
d1jhoni1b

あなたがサードパーティ製のツールを使用してオープンであれば、あなたはこれを見ているでしょう: 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 AP​​Iと通信するのはとても簡単です。

$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
Tobias