Проверка наличия ключа в объектно-ориентированном программировании

#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» было бонусом, как и конкретные части ошибок. Хотя я уже написал функцию для вывода ошибок, я не был уверен, насколько она корректна, поэтому вы помогли подтвердить и это.