今日は、APIスタイルでhttpリクエストを記述し、必要な形式でサーバーの応答を解析できる小さなライブラリについてお話したいと思います。
注:他の人のデータを使用する場合は、著作権を忘れないでください。
設置
ライブラリはcomposerを介してインストールできるので、必要なことは、「sleeping-owl / apist」依存関係:「1. *」をcomposer.jsonに追加し、composer updateを呼び出すことだけです。
このライブラリはどのフレームワークにも依存しないため、任意のフレームワークで使用することも、純粋なPHPプロジェクトで使用することもできます。 Guzzleはネットワークリクエストに使用され、symfony / dom-crawlerはdomツリーの操作に使用されます。
使用する
インストール後、必要なサイトのAPIを具体化する新しいクラスの作成を開始できます。 ライブラリは、クラスを作成する方法と場所に制限を課しません。 SleepingOwl \ Apist \ Apistクラスを拡張し、ベースURLを指定する必要があります。
use SleepingOwl\Apist\Apist; class HabrApi extends Apist { protected $baseUrl = 'http://habrahabr.ru'; }
基本的な説明に必要なのはこれだけです。 次に、このクラスに必要なメソッドを追加できます。
public function index() { return $this->get('/', [ 'title' => Apist::filter('.page_head .title')->text()->trim(), 'posts' => Apist::filter('.posts .post')->each([ 'title' => Apist::filter('h1.title a')->text(), 'link' => Apist::filter('h1.title a')->attr('href'), 'hubs' => Apist::filter('.hubs a')->each(Apist::filter('*')->text()), 'author' => [ 'username' => Apist::filter('.author a'), 'profile_link' => Apist::filter('.author a')->attr('href'), 'rating' => Apist::filter('.author .rating')->text() ] ]) ]); }
ここで、getメソッドは使用されるhttp要求のタイプであり、他のメソッドも使用できます(post、put、patch、deleteなど)。
最初のパラメーターはこのメソッドのURLであり、相対または絶対のいずれかです。
2番目のパラメーター -これは、このライブラリーを作成した理由です。 このメソッドを呼び出した結果として取得する必要がある構造を記述します。 配列または単一の値のいずれかです。 つまり、上記の方法の場合、結果は次の形式になります。
$api = new HabrApi; $result = $api->index();
注:結果は配列型になりますが、ここでは便宜上json形式を使用しています。
{ "title": "", "posts": [ { "title": " Shellshock ( 2)", "link": "http:\/\/habrahabr.ru\/company\/host-tracker\/blog\/240389\/", "hubs": [ " ", " ", " " ], "author": { "username": "smiHT", "profile_link": "http:\/\/habrahabr.ru\/users\/smiHT\/", "rating": "26,9" } }, { "title": " PentestIT", "link": "http:\/\/habrahabr.ru\/company\/pentestit\/blog\/240995\/", "hubs": [ " PentestIT", " IT", " " ], "author": { "username": "pentestit-team", "profile_link": "http:\/\/habrahabr.ru\/users\/pentestit-team\/", "rating": "36,4" } }, ... ] }
3番目のオプションパラメータは、追加のリクエストパラメータ、変数の取得または投稿、ダウンロードしたファイル、リクエストヘッダーなどです。 完全なリストについては、Guzzleのドキュメントをご覧ください 。
フィルターを作成する
これがどのように機能するかについてのいくつかの言葉:データのロード後にApist :: filter($ cssSelector)を介して作成されたすべてのオブジェクトは目的の値に置き換えられ、データを検索するセレクターだけでなく、呼び出しの文字列全体も保存します、それに適用されました。 データを読み込んだ後、彼はこれらのメソッドを見つかった要素に適用しようとします。
適用できるメソッドの種類を以下に示します(必要な順序で組み合わせることができます)。
- domツリー内を移動してデータを受信するためのSymfony \ Component \ DomCrawler \ Crawlerクラスのメソッド:
Apist::filter('.navbar li')->eq(3)->filter('a.active')->text(); Apist::filter('input')->first()->attr('value'); Apist::filter('.content')->html();
- 私が作成したメソッドは次のとおりです。
Apist::filter('body')->element(); // Symfony\Component\DomCrawler\Crawler, body Apist::filter('.post')->each(...); // , , . css- . Apist::filter('.errors')->exists()->then(...)->else(...); // , "errors" , "then", "else"
- ルート名前空間に記述されているPHP関数または関数。 この場合、現在の要素は最初のパラメーターとして渡され、残りのパラメーターは初期化中に指定したものになります。
Apist::filter('.title')->text()->mb_strtoupper()->trim()->substr(5); function myFunc($string, $find, $replace) { return str_replace($find, $replace, $string); } Apist::filter('.title')->text()->myFunc('My', 'Your'); // ->text(), , . .
プロジェクトWebサイトの例で使用されているHabrApi.phpデモクラスのソースは、 ここで表示できます 。
GitHubのソース | ドキュメントと例
UPD:バージョン1.2.0では、yamlファイルからapiを初期化する機能が追加されました。詳細はドキュメントに記載されています 。