web-dev-qa-db-fra.com

file_get_contents génère 400 erreurs de demande incorrecte PHP

J'utilise simplement une file_get_contents() pour obtenir les derniers tweets d'un utilisateur comme celui-ci:

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

Cela fonctionne très bien sur mon localhost mais quand je le télécharge sur mon serveur, il génère cette erreur:

Avertissement: file_get_contents ( http://api.Twitter.com/1/statuses/user_timeline/User.json ) [ function.file-get-contents]: impossible d'ouvrir le flux: la requête HTTP a échoué! HTTP/1.0 400 Mauvaise demande ...

Vous ne savez pas ce qui pourrait en être la cause, peut-être une configuration php que je dois définir sur mon serveur?

Merci d'avance!

27
Javier Villanueva

Vous voudrez peut-être essayer d'utiliser curl pour récupérer les données au lieu de file_get_contents. curl prend mieux en charge la gestion des erreurs:

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

Cela peut vous donner une meilleure idée de la raison pour laquelle vous recevez l'erreur. Une erreur courante atteint la limite de débit sur votre serveur.

26
Ben Rowe

Vous pouvez utiliser file_get_contents en ajoutant le ignore_errors option définie sur true, vous obtiendrez ainsi tout le corps de la réponse en cas d'erreur (HTTP/1.1 400, par exemple) et pas seulement un simple false.

Vous pouvez voir un exemple ici: https://stackoverflow.com/a/11479968/3926617

Si vous souhaitez accéder aux en-têtes de réponse, vous pouvez utiliser $http_response_header après la demande.

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

3
Wandeber

Juste un petit addendum sur la réponse de Ben. Selon le manuel PHP , l'option CURLOPT_URL peut être définie lors de l'initialisation du handle cURL avec 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);
1
bytepan