1

以下は、RESTXMLAPIから結果をフェッチするためのコードの簡単な例です。

これは、この質問のために実際のPHPクラスから抽出したほんの一部です。

XMLドキュメントを返すAPIURLで、1つのページからすべての結果をフェッチしてから、次のページからフェッチする方法に興味があります。

$this->api_pageAPIがデータを返すページを設定します。

SimpleXMLElementたとえば、APIの10ページまたはすべてのページからページ番号からデータを返し、そのページの結果を読み込んでから次のページを取得する方法を使用して、以下の基本コードを見てください。

現在、JavaScriptとPHPをPage number使用して、スクリプトにURLを渡すことでこれを行っています$_GET['page']。これには、ユーザーがページをロードする必要があり、ページがずさんなものであるという問題があります。

私の実際のAPIスクリプトは、サーバー上のCronジョブから実行されるので、それを念頭に置いて、どのようにしてすべてのページをフェッチできますか?

以下のサンプルコードに基づいてこの質問をしますが、それは他のプロジェクトで頻繁に行う必要があるタスクであり、これを行うための良い方法がわからないためです。

<?php

$this->api_url = 'http://api.rescuegroups.org/rest/?key=' .$this->api_key.
'&type=animals&limit=' .$this->api_limit.
'&startPage='. $this->api_page;

$xmlObj = new SimpleXMLElement($this->api_url, NULL, TRUE); 

foreach($xmlObj->pet as $pet){

    echo $pet->animalID;
    echo $pet->orgID;
    echo $pet->status;

    // more fields from the  Pet object that is returned from the API call

    // Save results to my own Database

}
?>
4

1 に答える 1

4

非常に安定した環境で実行しているという仮定に基づいて、次のようにページをループできます。

<?php
$this->base_url = 'http://api.rescuegroups.org/rest/?key=' .$this->api_key.
'&type=animals&limit=' .$this->api_limit.
'&startPage=';
$start_page = $this->api_page;
$end_page = 10; //If you have a value for max pages.
// sometimes you might get the number of pages from the first returned XML and then you could update the $end_page inside the loop.

for ($counter = $start_page; $counter <= $end_page; $counter++) {
    try {
        $xmlObj = new SimpleXMLElement($this->base_url . $counter, NULL, TRUE); 

        foreach($xmlObj->pet as $pet){

            echo $pet->animalID;
            echo $pet->orgID;
            echo $pet->status;

            // more fields from the  Pet object that is returned from the API call

            // Save results to my own Database

        }


    } catch (Exception $e) {
        // Something went wrong, possibly no more pages?
        // Please Note! You wil also get an Exception if there is an error in the XML
        // If so you should do some extra error handling
        break;
    }
}

?>
于 2013-01-31T20:35:24.777 に答える