file_get_contents throws 400 Bad Request error PHP
Я просто использую file_get_contents()
получить последние твиты от пользователя, как это:
$tweet = json_decode(file_get_contents('http://api.twitter.com/1/statuses/user_timeline/User.json'));
Это хорошо работает на моем локальном хосте, но когда я загружаю его на свой сервер, он выдает эту ошибку:
Предупреждение: file_get_contents ( http://api.twitter.com/1/statuses/user_timeline/User.json) [function.file-get-contents]: не удалось открыть поток: ошибка HTTP-запроса! HTTP/1.0 400 неверный запрос...
Не уверен, что может быть причиной этого, может быть, конфигурацию php мне нужно установить на моем сервере?
Заранее спасибо!
4 ответа
Возможно, вы захотите попробовать использовать curl для извлечения данных вместо file_get_contents. curl имеет лучшую поддержку для обработки ошибок:
// make request
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://api.twitter.com/1/statuses/user_timeline/User.json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
// convert response
$output = json_decode($output);
// handle error; error output
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) {
var_dump($output);
}
curl_close($ch);
Это может дать вам лучшее представление о том, почему вы получаете ошибку. Распространенной ошибкой является ограничение скорости на вашем сервере.
Ты можешь использовать file_get_contents
добавив ignore_errors
опция установлена в true
, таким образом, вы получите все тело ответа в случае ошибки (например, HTTP/1.1 400), а не только простое false
,
Вы можете увидеть пример здесь: /questions/24178167/ignorirovanie-oshibok-v-http-obertke-filegetcontents/24178189#24178189
Если вы хотите получить доступ к заголовкам ответа, вы можете использовать $http_response_header
после запроса.
http://php.net/manual/en/reserved.variables.httpresponseheader.php
Просто небольшое дополнение к ответу Бена. Согласно руководству по PHP, опция CURLOPT_URL может быть установлена при инициализации ручки cURL с помощью curl_init().
// make request
$ch = curl_init("http://api.twitter.com/1/statuses/user_timeline/User.json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
// convert response
$output = json_decode($output);
// handle error; error output
if(curl_getinfo($ch, CURLINFO_HTTP_CODE) !== 200) {
var_dump($output);
}
curl_close($ch);
Добавьте этот код перед file_get_contents
stream_context_set_default( [
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false,
],
'http' => [
'ignore_errors' => true,
]
]);