#php #json #google-maps #object #geocoding
#php #json #google-карты #объект #геокодирование
Вопрос:
Данные из запроса Google API иногда отсутствуют (например, при вводе неверного адреса), и когда это происходит, возникает уродливая ошибка неизвестного ключа. Чтобы попытаться избежать уродливой ошибки, я преобразовал вызов в условный, но, похоже, не могу заставить его работать вообще таким образом, потому что мои навыки объектно-ориентированного программирования отсутствуют. Ниже приведено то, что у меня есть, и отмечены некоторые попытки, так что я делаю не так? Меня действительно волнует, только если $dataset->results[0] допустимо, как и все, что будет после этого, если это так.
$url = "https://maps.googleapis.com/maps/api/geocode/json?address=$Addressamp;key=$googlekey";
// Retrieve the URL contents
$c = curl_init();
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_FRESH_CONNECT, true);
curl_setopt($c, CURLOPT_URL, $url);
$jsonResponse = curl_exec($c);
curl_close($c);
$dataset = json_decode($jsonResponse);
if (isset($dataset->results[0])) :
//if (isset($dataset->results[0]->geometry->location)) :
//if (!empty($dataset)) :
//if (!empty($dataset) amp;amp; json_last_error() === 0) :
$insertedVal = 1;
$latitude = $dataset->results[0]->geometry->location->lat;
$longitude = $dataset->results[0]->geometry->location->lng;
return "$latitude,$longitude";
endif;
Ответ №1:
Вы должны знать, что веб-служба API геокодирования также возвращает статус в ответе. Статус указывает, есть ли в ответе допустимый элемент или что-то пошло не так, и у вас нет никакого результата.
Взгляните на документацию https://developers.google.com/maps/documentation/geocoding/intro#StatusCodes и вы увидите, что существуют следующие возможные статусы
- «OK»
- «ZERO_RESULTS»
- «OVER_DAILY_LIMIT»
- «OVER_QUERY_LIMIT»
- «REQUEST_DENIED»
- «INVALID_REQUEST»
- «UNKNOWN_ERROR»
Итак, прежде чем пытаться получить доступ, $dataset->results[0]
сначала проверьте значение $dataset->status
. Если это «OK», вы можете безопасно получить результаты, в противном случае обработайте код ошибки правильно.
Фрагмент кода может быть
$dataset = json_decode($jsonResponse);
if ($dataset->status == "OK") {
if (isset($dataset->results[0])) {
$latitude = $dataset->results[0]->geometry->location->lat;
$longitude = $dataset->results[0]->geometry->location->lng;
}
} elseif ($dataset->status == "ZERO_RESULTS") {
//TODO: process zero results response
} elseif ($dataset->status == "OVER_DAILY_LIMIT" {
//TODO: process over daily quota
} elseif ($dataset->status == "OVER_QUERY_LIMIT" {
//TODO: process over QPS quota
} elseif ($dataset->status == "REQUEST_DENIED" {
//TODO: process request denied
} elseif ($dataset->status == "INVALID_REQUEST" {
//TODO: process invalid request response
} elseif ($dataset->status == "UNKNOWN_ERROR" {
//TODO: process unknown error response
}
Я надеюсь, что это поможет!
Комментарии:
1. Спасибо, это именно то, что мне нужно было знать, и, хотя вы не ответили на точный вопрос, в вашем примере показана проверка isset($dataset-> results[0]) так же, как и я, что подтвердило, что я все делал правильно. Добавление $dataset->status == «OK» было бонусом, как и конкретные части ошибок. Хотя я уже написал функцию для вывода ошибок, я не был уверен, насколько она корректна, поэтому вы помогли подтвердить и это.