API方法,根据收到的记录计数递归地发出请求


API method to recursively make requests based on record count received

我正在做一个API集成,并试图找出解决这个问题的最佳方法。API请求返回两个数组键= 'recsindb'和'recsonpage'。我可以请求最多500条记录('no-of-records=500', 'page-no=1'),但如果有更多的记录,我就需要发出第二次请求('no-of-records=500', 'page-no=2')。我将这些记录保存到joomla数据库中,所以我不太担心将两个数组集连接在一起-我只需要调用,插入它,然后再做一次。

这是我到目前为止在我的代码....这对于前500条记录工作得很好,但我需要一些帮助来弄清楚如何使下500条工作。

function getData($api) {
    $this->add("auth-userid", $this->params->get('auth_user'));
    $this->add("api-key", $this->params->get('auth_key'));
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_URL, "https://httpapi.com/api/" . $api . "?" . $this->buildstring());
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $data = curl_exec($ch);
        curl_close($ch);
        return json_decode($data, true);
}
/*
 * Methods used for building API URI 
 * For example, domain availability check allows multiple domain-name and tld pairs
 *
 * Example usage:
 * $qs->trigger('add', array('filter', '1'));
 * $qs->trigger('add', array('filter', '2'));
 * var_dump($qs->buildstring()); // filter=1&filter=2
 */
private $parts = array();
public function add($key, $value) {
    $this->parts[] = array(
        'key' => $key,
        'value' => $value
    );
}
public function buildstring($separator = '&', $equals = '=') {
    $queryString = array();
    foreach ($this->parts as $part) {
        $queryString[] = urlencode($part['key']) . $equals . urlencode($part['value']);
    }
    return implode($separator, $queryString);
}

然后获取数据,我将这样做:

JPluginHelper::importPlugin('authentication');
$dispatcher = JEventDispatcher::getInstance();
$profile = JUserHelper::getProfile();
// Process the api plugin.
$dispatcher->trigger('add', array('no-of-records', 500));
$dispatcher->trigger('add', array('page-no', 1));
$dispatcher->trigger('add', array('customer-id', $profile->profile['customerid']));
$data = $dispatcher->trigger('getData', 'contacts/search.json');

编辑:我仍然在尝试解决这个问题,所以我把上面的方法拉到我的本地示例环境中,而不是Joomla中。

$trigger = new customClass;
$page = 1;
$records = "records.txt";
$fh = fopen($records, 'a') or die("can't open file");
do {
    $trigger->add('no-of-records', 1);
    $trigger->add('page-no', $page);
    $data = $trigger->getData('billing/customer-transactions/search.json');
    fwrite($fh, print_r($data,true));
    $page++;
} while ($page * $data['recsonpage'] <= $data['recsindb']);
echo "<pre>" . print_r($data, true) . "</pre>";

这种方式的问题是,我得到1记录8次(在数据库中的每个事务)。

我知道为什么我得到1记录8次了。我在循环中使用的方法不是每次都重新创建,所以它只是添加到已经存在的东西上,所以API只查看要响应的第一组请求。

我添加了一个方法来取消设置的部分数组,并将其添加到我的循环结束…修复。

function end() {
    unset($this->parts);
}