PHP Json filet_get_contents не работает

Я использую API Twitch для этого. Я пытаюсь выяснить, если пользователь не существует. Все остальные вызовы API работают отлично, кроме:

$json_array = json_decode(file_get_contents('https://api.twitch.tv/kraken/users/'.strtolower($channelName).'?client_id='.$client_id), true);

if ($json_array['status'] == '404') {
$errors['twitch_name'] = '* Twitch user does not exist.';
}

Моя обработка ошибок работает отлично, так что это не так.

Допустим, что ссылка в конечном итоге будет:

https://api.twitch.tv/kraken/users/notarealname123

Я пытаюсь достичь ошибки 404 правильно? Или этот 404 должен вызываться из какого-то заголовка?

Спасибо!

0

Решение

Может быть, это какая-то проблема с file_get_contents, с помощью curl работает отлично:

$url = 'https://api.twitch.tv/kraken/users/'.strtolower($channelName).'?client_id='.$client_id;

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
$json_response = json_decode(curl_exec($ch));
if ($json_response->status == '404') {
$errors['twitch_name'] = '* Twitch user does not exist.';
}
0

Другие решения

$http_response_header

$http_response_header специальная переменная, заполненная массивом заголовков, полученных последним http-запросом ( file_get_contents) и выглядит так (пример из php.net):

array(9) {
[0]=> string(15) "HTTP/1.1 200 OK"[1]=> string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"[2]=> string(29) "Server: Apache/2.2.3 (CentOS)"[3]=> string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"[4]=> string(27) "ETag: "280100-1b6-80bfd280""[5]=> string(20) "Accept-Ranges: bytes"[6]=> string(19) "Content-Length: 438"[7]=> string(17) "Connection: close"[8]=> string(38) "Content-Type: text/html; charset=UTF-8"}

Таким образом, код состояния находится внутри строки в индексе 0


Вы можете извлечь код состояния, используя:

function HTTPStatusCode(){
// Look for exactly three numbers inside headers index 0
preg_match('/[0-9]{3}/', $http_response_header[0], $matches);
// Return the first (should be also the only) match found in the string
return (number)$matches[0];
}

$statusCode = HTTPStatusCode();

А затем проверьте 404

$json_array = json_decode(file_get_contents('https://api.twitch.tv/kraken/users/'.strtolower($channelName).'?client_id='.$client_id), true);

if (HTTPStatusCode() == 404) {
// Handle it
$errors['twitch_name'] = '* Twitch user does not exist.';
}

Или даже более общий (работает для каждой ошибки, а не только 404):

$file = file_get_contents('https://api.twitch.tv/kraken/users/'.strtolower($channelName).'?client_id='.$client_id);

// file_get_contents returns false on error
if ($file === false) {
// Handle it
$errors['twitch_name'] = '* Twitch user does not exist.';
}
else {
$json_array = joon_decode($file, 1);
}
0

Зачем делать вещи сложнее, чем они должны быть с использованием CURL? (Это работает, отлично, но в этом нет необходимости). File_get_contents не любит ошибки, это правда. Так что, чем просто упростить вещи, проверьте, какой ключ должен существовать, если он есть, отлично! Если это ноль, хорошо, тогда мы столкнулись с ошибкой.

if($json_array['display_name'] == null)
{
echo 'Sorry, ' . htmlspecialchars($_GET["channelName"]) . ' isn\'t a Twitch streamer!';
die();
}

Это код, который я использую в своем API. Прекрасно работает для меня.

0
По вопросам рекламы [email protected]