Google Places Near API Success 200, но возвращает «INVALID_REQUEST» в Laravel - PullRequest
2 голосов
/ 19 февраля 2020

Я пытаюсь создать итеративный сканер для Google Places API. Как известно любому, кто использовал их API, ответ содержит только 20 результатов на страницу, и я пытаюсь получить полный список результатов, поэтому я создал l oop, который будет выполнять функцию, если присутствует поле next_page_token , Самое необычное происходит потому, что он успешно извлекает и отображает первые 20 результатов, но не выполняет второй поиск, но не выдает никаких ошибок в Laravel. Код для этого выглядит следующим образом (это Laravel)

public function getAllPlaces(){
        if (Auth::user()->id != '5') {
            return redirect('/userlanding')->with('error', 'Denied access');
        } else {
            $client = new Client();

            $types = 'park';

            $radius = '50000';

            $location = [

                'latitude' => '36.187740',

                'longitude' => '-92.731422'

            ];

            $keyword = '';

            $requestQuery = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location={$location['latitude']},{$location['longitude']}&radius={$radius}&type={$types}{$keyword}&key=MYSUPERSECRETKEY";

            $response = $client->request('GET', $requestQuery);
            $statusCode = $response->getStatusCode();
            $body = $response->getBody()->getContents();

            $body = json_decode($body);

            $numofrecordspresent = 0;

            $data = $body->results;

            $results = collect();
            foreach($data as $result) {
                 $results->push($result;      
                 $numofrecordspresent = $numofrecordspresent + 1;
                }
            }

            if(isset($body->next_page_token)) {
                $loopData = [

                    'nexttoken' => $body->next_page_token,

                    'locationData' => $location,

                    'numofrecordspresent' => $numofrecordspresent,

                    'radius' => $radius,

                    'types' => $types,

                    'keyword' => $keyword,

                    'client' => $client,

                ];

                $this->loopedPlaceSearch($loopData);
            } else {
                return view('apireturnpage')->with('numofrecordspresent', $numofrecordspresent);
            }
        }
    }

    public function loopedPlaceSearch($loopData) {
        $client = new Client();

        $location = $loopData['locationData'];
        $numofrecordspresent = $loopData['numofrecordspresent'];
        $pagetoken = $loopData['nexttoken'];
        $radius = $loopData['radius'];
        $types = $loopData['types'];
        $keyword = $loopData['keyword'];

        $requestQuery = "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location={$location['latitude']},{$location['longitude']}&radius={$radius}&type={$types}{$keyword}&pagetoken={$pagetoken}&key=MYSUPERSECRETKEY";

        $response = $client->request('GET', $requestQuery);
        $statusCode = $response->getStatusCode();
        $body = $response->getBody()->getContents();

        $body = json_decode($body);

        $data = $body->results;

        $results = collect();
        foreach($data as $result) {
             $results->push($result;      
             $numofrecordspresent = $numofrecordspresent + 1;
            }
        }

        if (isset($body->next_page_token)) {
            $loopData = [

                'nexttoken' => $body->next_page_token,

                'locationData' => $location,

                'numofrecordspresent' => $numofrecordspresent,

            ];


            $this->loopedPlaceSearch($loopData);
        } else {
            return view('apireturnpage')->with('numofrecordspresent', $numofrecordspresent);
        }
    }

На данный момент, чтобы проработать то, что я сказал ранее, первая функция, которая вызывается из сети. php работает просто отлично, помещая все 20 результатов в коллекцию результатов, но когда есть больше результатов (то есть присутствует next_page_token), вторая функция вызывается, но возвращает «INVALID_REQUEST» в теле. Это очень странно, потому что получение точной фактической строки запроса из второй функции, которая используется, но не удается, и помещение ее в мою строку URL-адреса возвращает правильный ответ, исключая любые опечатки в вызове API.

Любая помощь будет Буду признателен, похоже, это ошибка, и я не могу понять, почему она не работает.

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Прошло много времени с тех пор, как я сделал это сообщение, но для тех, кто просто нашел это сейчас с той же проблемой, я решил объяснить, почему это произошло и как я это исправил. Оказывается, без задержки в сценарии сервер пытается сделать еще один запрос, в то время как другой ответ все еще возвращается, что вызывает проблему. Это очень просто исправить, добавив sleep () или usleep () перед выполнением каждого запроса, чтобы предотвратить одновременное выполнение нескольких вызовов.

0 голосов
/ 19 февраля 2020

Похоже, вам не хватает закрывающей скобки в обоих результатах:

$results->push($result;      

Я не знаю, исправит ли это, но это беспокоит меня!

...