PHP - сбор данных из разбитых на страницы результатов API (в XML) - PullRequest
0 голосов
/ 14 января 2020

Я получаю доступ к данным из API, предоставляющего XML, используя PHP, с форматом поиска и URL-адресом, подобным этому:

$response = $oauth->get('https://example.com/Main/1');

В этом случае " 1"это номер страницы. Он вернет первые 100 результатов. (Это у меня все работает.)

Но если есть еще результаты, я не могу получить к ним доступ в настоящее время автоматически. (Мне бы пришлось изменить URL-адрес вручную.)

Возвращенное значение XML отобразит <Links><rel>last</rel><href>https://example.com/Main/3</href></Links> количества страниц. (В данном случае доступно 3 страниц.)

Вот пример возвращаемого значения XML:

<?xml version="1.0" encoding="UTF-8"?>
<Fleet xmlns="http://standards.iso.org/iso/15143/-3" version="2" snapshotTime="2020-01-13T20:12:55.224Z">
  <Links>
    <rel>self</rel>
    <href>https://example.com/Main/1</href>
  </Links>
  <Links>
    <rel>last</rel>
    <href>https://example.com/Main/3</href>
  </Links>
  <Equipment>
    <EquipmentHeader>
      <OEMName>CAT</OEMName>
      <Model>D6</Model>
      <EquipmentID>1111111</EquipmentID>
      <SerialNumber>1111111</SerialNumber>
      <PIN>1111111</PIN>
    </EquipmentHeader>
    <CumulativeOperatingHours datetime="2018-07-29T18:15:30.000Z">
      <Hour>1111</Hour>
    </CumulativeOperatingHours>
  </Equipment>
  // ... and so on - 100 results...
</Fleet>

Существует ли простой способ проверить значение данные последней страницы, а затем l oop путем извлечения данных с каждой из страниц (с первой до последней)?

(Поскольку я не буду знать, сколько страниц существует до первой результаты запроса возвращаются.)

ОБНОВЛЕНИЕ Я придумал это для определения количества страниц:

$total_pages = NULL;
$xml = simplexml_load_string($response);
// Get used name space, and use that
$namespaces = $xml->getDocNamespaces();
if(isset($namespaces[''])) {
    $defaultNamespaceUrl = $namespaces[''];
    $xml->registerXPathNamespace('default', $defaultNamespaceUrl);
    $nsprefix = 'default:';
} else {$nsprefix = '';}
$nodes = $xml->xpath('//'.$nsprefix.'Links');
foreach($nodes as $node) {
    if($node->rel == 'last'){
        $last_page_url = $node->href;
        $pos = strrpos($last_page_url, '/'); // position of last slash in url
        $total_pages = $pos === false ? 0 : substr($last_page_url, $pos + 1); // if slash doesn't exist, then 0, otherwise the value after the last slash
    } // end if
} // end foreach
echo $total_pages;

Так что теперь мне нужно выяснить, как к l oop через запросы ...

1 Ответ

1 голос
/ 14 января 2020

Во-первых, вы могли бы упростить поиск последней страницы, используя DOMXPath :

$domDocument = new \DOMDocument();
$domDocument->loadXML($response);

$xpath = new \DOMXPath($domDocument);
$xpath->registerNamespace('d', 'http://standards.iso.org/iso/15143/-3');
$lastPageHref = $xpath->evaluate('string(//d:Links/d:rel[text()="last"]/following-sibling::d:href)');
$lastPage = (int)basename($lastPageHref);

Это получает элемент href, который является прямым последующим братом элемента rel текстовое содержимое которого "Last", которое само является потомком элемента Links в любом месте в do c.

Затем оно использует basename для получения последней части этого URL и преобразует его в целое число.

Демо: https://3v4l.org/urfU3

Оттуда вы можете просто сделать что-то вроде этого (где OAuthClass должен быть заменен на класс $oauth):

function fetchPage(YourOAuthClass $oauth, int $page): \DOMDocument 
{
  $xml = $oauth->get("https://example.com/Main/$page");

  $domDocument = new \DOMDocument();
  $domDocument->loadXML($xml);

  return $domDocument;
}

$domDocument = fetchPage($oauth, 1);

// Here, do the code above to grab $lastPage
// Also do stuff with $domDocument (handle page 1)

for ($page = 2; $page <= $lastPage; $page++) {
  $domDocument = fetchPage($oauth, $page);

  // Do stuff with $domDocument (handle current page)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...