Получение кода состояния http из file_get_contents внутри вспомогательной функции - PullRequest
0 голосов
/ 10 мая 2018

У меня есть пользовательская вспомогательная функция (Codeigniter 3), которую я создал, которая создает URL-адрес, передает этот URL-адрес в функцию file_get_contents(), а затем оборачивает все это в функцию json_decode() и возвращает ее в мой controller, который загружает view для обработки. Вот функция:

function get_json($zipcode) {
    $api_key = KEY;
    $url = 'https://example.com/request.json?api_key=' . $api_key . '&address=' . $zipcode;

    return json_decode(file_get_contents($url), true);
    }

Я вызываю это в моем контроллере здесь:

$this->load->helper('functions_helper');
$data['json'] =  get_json($data['zipcode']);

Затем я создаю таблицу в моем view на основе возвращенных данных:

<?php if (isset($json)) : ?>
    <?php if ($json['metadata']['resultset']['count'] == 0 || http_response_code() == 400): //response code doesn't work ?>

        <div class="inline-block">
            <h3>We apologize but we couldn't locate any results in your area.</h3>
        </div>

    <?php else : ?>

        <table class="table table-striped table-responsive">
            <!-- table elements -->
        </table>
    <?php endif ?>
<?php endif ?>

Это работает, пока мой источник json api работает и надежен. Однако, если я передаю значение почтового индекса, которое не является действительным почтовым индексом, API возвращает следующее с кодом состояния http 400:

{
   "inputs": {
      "address": "00607"
   },
   "metadata": {
      "version": "2.0.0",
      "resultset": {
         "count": 0
      }
   },
   "status": 400,
   "errors": [
      "Unable to geocode address: 00607"
   ]
}

Это ломает мою страницу, и я получаю ошибку php вверху failed to open stream: HTTP request failed! HTTP/1.1 400 Bad Request, даже если я пытаюсь получить статус от возвращенного json json['status']

Также, если источник json не работает (http код состояния 500), я получаю то же самое.

Мой вопрос: как я могу проверить код состояния в моей функции, прежде чем передать его на мою страницу? Я попытался проверить перед построением своей таблицы на странице выше, но, конечно, моя страница дает код состояния 200, который является статусом view построенного controller, а не статусом фактических результатов JSON.

1 Ответ

0 голосов
/ 10 мая 2018

Как предложил Рик в комментариях, вы должны использовать curl.

function get_json($zipcode) {
    $api_key = KEY;
    $url = 'https://example.com/request.json?api_key=' . $api_key . '&address=' . $zipcode;
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_URL, $url);
    $result = curl_exec($ch);
    $http_code = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if ($http_code == 200) {
        return json_decode($result, true);
    } else {
        return false;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...