Я использую 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 должен вызываться из какого-то заголовка?
Спасибо!
Может быть, это какая-то проблема с 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.';
}
$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);
}
Зачем делать вещи сложнее, чем они должны быть с использованием CURL? (Это работает, отлично, но в этом нет необходимости). File_get_contents не любит ошибки, это правда. Так что, чем просто упростить вещи, проверьте, какой ключ должен существовать, если он есть, отлично! Если это ноль, хорошо, тогда мы столкнулись с ошибкой.
if($json_array['display_name'] == null)
{
echo 'Sorry, ' . htmlspecialchars($_GET["channelName"]) . ' isn\'t a Twitch streamer!';
die();
}
Это код, который я использую в своем API. Прекрасно работает для меня.