Циклическое пролистывание нескольких страниц JSON-запроса (Guzzle, Laravel, PHP)

Циклическое пролистывание нескольких страниц JSON-запроса (Guzzle, Laravel, PHP)

18.02.2020 11:06:10 Просмотров 25 Источник

Новый dev здесь, так что я сожалею, если это простой вопрос или что-то в этом роде, но не смог найти именно то, что я ищу (вполне может быть, что я не задаю вопрос правильно) в основном у меня есть разбитый на страницы список, возвращающийся из api, и я не уверен, что логика была бы в состоянии циклически просматривать эти страницы. Вот код, который у меня есть до сих пор, который отлично работает для первой страницы lol.

    public function handle()
    {
        //This is the artisan command that runs on a timer and gets all the ticket and update fields that are needed and saves them to the database.
        $tickets = $this->pullTicketSummary();
        collect($tickets['data'])
            ->each(function ($currTicket) {

                $ticketRow = Tickets::query()->firstOrCreate(['ticket_id' => $currTicket['id']]);
                $ticketRow->status_id = $currTicket['status']['id'];
                $ticketRow->category_id = $currTicket['category']['id'];
                $ticketRow->user_id = $currTicket['assigned_to']['id'];
                $ticketRow->jira_issue_id = $currTicket['jira_issue_id'];
                $ticketRow->save();

                collect($currTicket['updates'])->each(function ($update) use ($currTicket){
                    $updateRow = Update::query()->firstOrCreate(['update_id' => $update['update_id']]);
                    $updateRow->ticket_id = $currTicket['id'];
                    $updateRow->assignee_change = $update['assignee_change'];
                });
            });
        Log::info('All tickets and updates were pulled successfully');
    }

    protected function pullTicketSummary()
    {       //Function makes the guzzle request and returns the response from the happyfox api
            $client = new Client();
            $request = $client->get('https://happyfox.com/api/1.1/json/tickets/?size=50&page=1',
                ['auth' => ['N/A']);
            $response = json_decode($request->getBody()->getContents(), true);
            return $response;

    }

С тем фактом, что я новичок, если это что-то, что было отвечено раньше, что я пропустил, пожалуйста, просто застрелите меня по ссылке или если вы знаете о какой-либо документации, которая помогла бы мне получить ответ самостоятельно, что было бы потрясающе! Спасибо!

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/60288653/looping-through-multiple-pages-of-a-json-request-guzzle-laravel-php#comment106643434_60288653
Что там с кодом? Мне немного непонятно, где вам нужна помощь. Дает ли он ошибки?
https://stackoverflow.com/questions/60288653/looping-through-multiple-pages-of-a-json-request-guzzle-laravel-php#comment106643505_60288653
@Arjan Нет! он отлично работает для первой страницы ответа, но это ответ с разбиением на страницы, и я не уверен, как можно сделать так, чтобы он прошел через каждую страницу этого ответа самостоятельно.
https://stackoverflow.com/questions/60288653/looping-through-multiple-pages-of-a-json-request-guzzle-laravel-php#comment106643532_60288653
@Felippe Да! просто я не знаю лучшего способа сделать это после того, как сам немного покопался.
https://stackoverflow.com/questions/60288653/looping-through-multiple-pages-of-a-json-request-guzzle-laravel-php#comment106643633_60288653
Показывает ли API количество страниц?
https://stackoverflow.com/questions/60288653/looping-through-multiple-pages-of-a-json-request-guzzle-laravel-php#comment106643717_60288653
@Felippe да на почтальоне это дало мне знать, что это 1 из 203 страниц, однако с большим количеством данных, которые вводит пользователь, это число будет расти. Поэтому мне было интересно, есть ли способ заставить его просто продолжать, пока он не достигнет все увеличивающейся последней страницы.

Ответы - Циклическое пролистывание нескольких страниц JSON-запроса (Guzzle, Laravel, PHP) / Looping through multiple pages of a JSON request (Guzzle, Laravel, PHP)

Является ответом!
Felippe Duarte

18.02.2020 11:35:10

Обновите функцию, чтобы использовать номер страницы:

protected function pullTicketSummary($page)
{       //Function makes the guzzle request and returns the response from the happyfox api
        $client = new Client();
        $request = $client->get('https://happyfox.com/api/1.1/json/tickets/?size=50&page='.$page,
            ['auth' => ['N/A']);
        $response = json_decode($request->getBody()->getContents(), true);
        return $response;

}

//new function only to save the data from tickets variable. Necessary to reuse.
public function saveTicketsOrSomething($tickets)
{
    collect($tickets['data'])
        ->each(function ($currTicket) {

            $ticketRow = Tickets::query()->firstOrCreate(['ticket_id' => $currTicket['id']]);
            $ticketRow->status_id = $currTicket['status']['id'];
            $ticketRow->category_id = $currTicket['category']['id'];
            $ticketRow->user_id = $currTicket['assigned_to']['id'];
            $ticketRow->jira_issue_id = $currTicket['jira_issue_id'];
            $ticketRow->save();

            collect($currTicket['updates'])->each(function ($update) use ($currTicket){
                $updateRow = Update::query()->firstOrCreate(['update_id' => $update['update_id']]);
                $updateRow->ticket_id = $currTicket['id'];
                $updateRow->assignee_change = $update['assignee_change'];
            });
        });
}

Затем повторяйте, пока не закончите все страницы:

    $tickets = $this->pullTicketSummary(1); //first time
    $numPages = $tickets['numPages']; //update here to get the actual value of number of pages
    $this->saveTicketsOrSomething($tickets);

    for ($i = 2; $i < $numPages; $i++) { //start on 2, cause we already have fetched page 1
        $tickets = $this->pullTicketSummary($i); //other pages
        $this->saveTicketsOrSomething($tickets);
    }
    Log::info('All tickets and updates were pulled successfully');
https://stackoverflow.com/questions/60288653/looping-through-multiple-pages-of-a-json-request-guzzle-laravel-php/60289053#comment106644087_60289053
Так что в конечном итоге я бы сделал логику для итерации по каждой странице в свою собственную функцию, а не в самом запросе. Спасибо!
https://stackoverflow.com/questions/60288653/looping-through-multiple-pages-of-a-json-request-guzzle-laravel-php/60289053#comment106644279_60289053
Я не думаю, что это возможно сделать в самом запросе. В любом случае, если это решит для вас, вы можете отметить, как принято.
https://stackoverflow.com/questions/60288653/looping-through-multiple-pages-of-a-json-request-guzzle-laravel-php/60289053#comment106644357_60289053
Я обязательно доложу об этом!
Закрыть X