RESTful Webサービスに接続しようとしていますが、特にPUTとDELETEを介してデータを送信するときに問題が発生します。cURLの場合、PUTは送信するファイルを必要とし、DELETEは奇妙です。PHPのソケットサポートを使用してクライアントを作成し、HTTPヘッダーを自分で作成することは完全に可能ですが、PHP用のRESTクライアントを使用したことがあるか、見たことがあるかどうかを知りたいと思いました。
8 に答える
したがって、結局のところ、Zend_Rest_ClientはRESTクライアントではありません。たとえば、PUTメソッドとDELETEメソッドをサポートしていません。実際のRESTfulサービスで動作するようにそれを理解しようとした後、私はうんざりして、PHP用の適切なRESTクライアントを作成しました。
http://github.com/educoder/pest
それはまだいくつかのことが欠けていますが、それが拾われたら、私はそれにもう少し作業を入れます。
OpenStreetMapRESTサービスの使用例を次に示します。
<?php
/**
* This PestXML usage example pulls data from the OpenStreetMap API.
* (see http://wiki.openstreetmap.org/wiki/API_v0.6)
**/
require_once 'PestXML.php';
$pest = new PestXML('http://api.openstreetmap.org/api/0.6');
// Retrieve map data for the University of Toronto campus
$map = $pest->get('/map?bbox=-79.39997,43.65827,-79.39344,43.66903');
// Print all of the street names in the map
$streets = $map->xpath('//way/tag[@k="name"]');
foreach ($streets as $s) {
echo $s['v'] . "\n";
}
?>
現在はcurlを使用していますが、将来的にはHTTP_RequestまたはHTTP_Request2に切り替える可能性があります。
更新:かなりの数の人々がこれに飛びついたようです。Pestは、GitHubの寄稿者のおかげで、HTTP認証やその他の多くの機能をサポートするようになりました。
GuzzleというPHPHTTPクライアントを作成しました。Guzzleは、RESTWebサービスクライアントを構築するためのHTTPクライアントおよびフレームワークです。Guzzleの詳細については、そのWebサイトを参照するか、githubのソースに直接アクセスしてください:https ://github.com/guzzle/guzzle
Guzzleは、ほとんどのHTTPクライアントが提供する優れた機能(よりシンプルなインターフェイス、すべてのHTTPメソッド、および要求/応答の表示)を提供しますが、その他の高度な機能も提供します。
- ストリーミングエンティティ本体
- 指数バックオフ
- 組み込みのキャッシングフォワードプロキシ
- クッキー
- ロギング
- 管理された持続的接続
- 並列リクエスト
- OAuth
- 任意の認証スキームを実装できるプラグインアーキテクチャ
- JSONサービス記述ファイルからのクライアントAPIの自動生成
唯一の欠点:PHP5.3.3が必要です
私はPHPの組み込みのcURLサポートを使用する傾向があります。オプションを使用すると、/などCURLOPT_CUSTOMREQUEST
を実行できます。PUT
DELETE
残りのクライアントのphpでの簡単な例-更新を以下に示します。
<?php
$url ="http://example.com";
$data = "The updated text message";
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); //for updating we have to use PUT method.
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
?>
残りのクライアントのphpでの簡単な例-categoryid=xxの削除を以下に示します。
<?php
$url ="http://example.com/categoryid=xx";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
$result = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
?>
私は長い間エレガントな解決策を見つけることができず、cURLの実装が好きではなく、自分で考え出しました。pecl httpモジュールに依存しているため、HTTP認証、リダイレクト、PUTなどをサポートします。
実装は素晴らしく、シンプルで、拡張も簡単です。
詳細については、こちらをご覧ください。
ZendRestClientで大成功を収めました
最近到着したのは、ZendFramework2の一部であるZend\Http\Clientです。
Composer経由でインストール可能(ただし、この記事の執筆時点では、Packagist経由ではありません。Zendのカスタムパッケージリポジトリhttp://packages.zendframework.com/を使用する必要があります)。
トピックを復活させると、このライブラリhttps://github.com/Respect/Rest/は非常に使いやすいことがわかりましたが、Web上にはいくつかの例があります。
require_once 'bootstrap.php';
require_once 'Respect/Rest/Router.php';
require_once 'Respect/Rest/Request.php';
use Respect\Rest\Router;
$router->post('/myApp/', function() {
$data_back = json_decode(file_get_contents('php://input'));
// var_dump($data_back);
return json_encode($data_back);
});
$router->get('/myApp/*', function($id = null) {
$json = json_encode(MyService::getInstance()->list());
return utf8_encode($json);
});
$router->put('/myApp/*', function($id = null) {
return 'Update: ' . $id;
});
$router->delete('/myApp/*', function($id = null) {
return 'Delete: ' . $id;
});