Подтвердить что ты не робот

File_get_contents throws 400 Ошибка Bad Request 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]: не удалось открыть stream: HTTP-запрос не удался! HTTP/1.0 400 Bad Request...

Не знаете, что может быть причиной этого, может быть, настроить php на моем сервере?

Спасибо заранее!

4b9b3361

Ответ 1

Возможно, вы захотите попробовать использовать 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);

Это может дать вам более полное представление о том, почему вы получаете сообщение об ошибке. Общей ошибкой является ограничение скорости на вашем сервере.

Ответ 2

Вы можете использовать file_get_contents, добавляя опцию ignore_errors, установленную в true, таким образом вы получите весь текст ответа в случае ошибки (например, HTTP/1.1 400), а не только простой false.

Здесь вы можете увидеть пример: fooobar.com/questions/271824/...

Если вы хотите получить доступ к заголовкам ответов, вы можете использовать $http_response_header после запроса.

http://php.net/manual/en/reserved.variables.httpresponseheader.php

Ответ 3

Просто небольшое добавление к ответу Бена. В соответствии с руководством по 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);