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,
        ]
    ]);
Другие вопросы по тегам