如何处理分页数据的RESTful API限制

时间:2019-12-04 16:06:52

标签: php arrays api pagination crm

我正在尝试创建脚本以使用其REST API从Campaigner帐户中获取特定数量的联系人,每个请求的联系人数量上限为1000,因此为了处理该脚本,我想出了以下代码

function get_field($array, $key, $value, $strict = false) {
    foreach ($array as $property) if (($property->$key == $value && $strict === false) || ($property->$key === $value && $strict === true)) return $property;
    return '';
}

$total_emails = 4000;
$break_after = 2000;
$total_iterations = $total_emails/$break_after;
$current_iteration = $_GET['i'];

use GuzzleHttp\Client;
$client = new Client([
    'base_uri' => 'https://edapi.campaigner.com/v1/',
    'auth' => ['<API_USER>', '<API_KEY>'],
]);

// Get total number of subscribers
$response = $client->get('Subscribers', ['query' => [
    'PageSize' => 1,
    'PageNumber' => 1,
]]);
$results = json_decode($response->getBody());

// Set some useful vars for later use
$total_subscribers = $results->TotalRecords; //40,000
$page_size = ($break_after > 1000 ? 1000 : $break_after); //1000
$max_emails = ($total_subscribers > $total_emails ? $total_emails : $total_subscribers); //4000
$max_pages = ceil($max_emails/$page_size); //4

$current_page = ($current_iteration*$max_pages)/$total_iterations;

// Get all contact details
$contacts = [];
for ($page_number = $current_page; $page_number < $max_pages; $page_number++) {
    r($page_number);
    $response = $client->get('Subscribers', [
        'query' => [
            'PageSize' => $page_size,
            'PageNumber' => $page_number+1,
            'Fields' => "FirstName,LastName,Tag",
        ]
    ]);
    $page_results = json_decode($response->getBody());
    $page_contacts = $page_results->Items;

    // Save contact details to an easy-to-read array
    foreach ($page_contacts as $contact) {
        $first_name = get_field($contact->CustomFields, 'FieldName', 'FirstName');
        $last_name = get_field($contact->CustomFields, 'FieldName', 'LastName');
        $tags = get_field($contact->CustomFields, 'FieldName', 'Tag');

        $contacts[] = [
            'ID' => $contact->EmailID,
            'FirstName' => $first_name->Value,
            'LastName' => $last_name->Value,
            'Tags' => explode(',', $tags->Value),
            'Email' => $contact->EmailAddress,
            'Status' => $contact->Status,
        ];
    }

    // Break after we have reached the desired number of emails for this iteration
    if (($page_size*$page_number) >= $break_after*$current_iteration) break;
}

r(count($contacts)); // Dump content of variable formatted in HTML

// For Debugging purposes
r([
    'total_subscribers' => $total_subscribers,
    'page_size' => $page_size,
    'max_emails' => $max_emails,
    'max_pages' => $max_pages,
]);

当我一次检索所有数据(即$total_emails = 4000; $break_after = 4000;)时,代码可以正常工作。 当我尝试获取部分数据(即$total_emails = 4000; $break_after = 2000;)并将迭代次数设置为1到$total_iterations

之间的某个问题时,就会出现问题。

0 个答案:

没有答案