31

I'm just using a file_get_contents() to get the latest tweets from a user like this:

$tweet = json_decode(file_get_contents('http://api.twitter.com/1/statuses/user_timeline/User.json'));

This works fine on my localhost but when I upload it to my server it throws this error:

Warning: file_get_contents(http://api.twitter.com/1/statuses/user_timeline/User.json) [function.file-get-contents]:failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request...

Not sure what might be causing it, maybe a php configuration I need to set on my server?

Thanks in advance!

Rasclatt
  • 12,498
  • 3
  • 25
  • 33
Javier Villanueva
  • 3,886
  • 13
  • 48
  • 80
  • read this: http://stackoverflow.com/questions/697472/file-get-contents-returning-failed-to-open-stream-http-request-failed – Book Of Zeus Dec 13 '11 at 00:28
  • 2
    Please see [this stack question][1] as it will probably answer you question. [1]: http://stackoverflow.com/questions/3710147/php-get-content-of-http-400-response – Peter Brooks Dec 13 '11 at 00:29

4 Answers4

33

You might want to try using curl to retrieve the data instead of file_get_contents. curl has better support for error handling:

// 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);

This may give you a better idea why you're receiving the error. A common error is hitting the rate limit on your server.

safarov
  • 7,793
  • 2
  • 36
  • 52
Ben Rowe
  • 28,406
  • 6
  • 55
  • 75
8

You can use file_get_contents adding the ignore_errors option set to true, in this way you will get the entire body of the response in case of error (HTTP/1.1 400, for example) and not only a simple false.

You can see an example here: https://stackoverflow.com/a/11479968/3926617

If you want access to response's headers, you can use $http_response_header after the request.

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

Community
  • 1
  • 1
Wandeber
  • 376
  • 3
  • 10
2

Just a little addendum on Ben's answer. According to the PHP manual the CURLOPT_URL option may be set when inizializing the cURL handle with 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);
bytepan
  • 361
  • 2
  • 5
0

Add this code before file_get_contents

 stream_context_set_default( [
        'ssl' => [
            'verify_peer' => false,
            'verify_peer_name' => false,
        ],
        'http' => [
            'ignore_errors' => true,
        ]
    ]);
jai3232
  • 383
  • 3
  • 6