114 votes

Le fichier PHP file_get_contents() retourne "impossible d'ouvrir le flux : échec de la requête HTTP!"

Je rencontre des problèmes pour appeler une URL depuis du code PHP. J'ai besoin d'appeler un service en utilisant une chaîne de requête depuis mon code PHP. Si je tape l'URL dans un navigateur, cela fonctionne correctement, mais si j'utilise file-get-contents() pour faire l'appel, j'obtiens :

Avertissement : file-get-contents(http://.... ) n'a pas pu ouvrir le flux : La requête HTTP a échoué ! HTTP/1.1 202 Accepté dans ...

Le code que j'utilise est le suivant :

$query=file_get_contents('http://###.##.##.##/mp/get?mpsrc=http://mybucket.s3.amazonaws.com/11111.mpg&mpaction=convert format=flv');
echo($query);

Comme je l'ai dit - ça fonctionne bien depuis le navigateur. Des suggestions ?

J'ai également essayé avec une autre URL comme :

$query=file_get_contents('http://www.youtube.com/watch?v=XiFrfeJ8dKM');

Cela fonctionne bien... est-ce que l'URL que je dois appeler aurait un deuxième http:// dedans ?

2voto

Sergey Points 21
$query=file_get_contents('http://###.##.##.##/mp/get?' . http_build_query(array('mpsrc' => 'http://mybucket.s3.amazonaws.com/11111.mpg&mpaction=convert format=flv')));

1voto

Teddy Verdecia Points 1

Cela ne fonctionnait pas pour moi et j'obtenais une valeur nulle pour la requête de résultat. J'ai donc vérifié sur postman pour voir si l'API renvoyait effectivement des valeurs et c'était le cas. Postman a cet onglet à droite où vous pouvez obtenir le code d'exemple qui a été utilisé pour obtenir les résultats et après avoir essayé cela a enfin fonctionné, mais initialement vous pourriez obtenir une erreur bizarre 411 disant que la longueur de la publication doit être spécifiée. J'ai ajouté la correction dans mon code ci-dessous. Pour contourner l'erreur de longueur 411 POST, créez un tableau vide et utilisez la fonction http_build_query. Ensuite, définissez cette variable dans l'option cURL CURLOPT_POSTFIELDS.

$data_string = array();
$curl = curl_init();
$test = http_build_query($data_string);
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://www.googleapis.com/geolocation/v1/geolocate?key=APIKEY',
CURLOPT_POSTFIELDS => $test,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'POST',
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;

0 votes

Cela a fonctionné pour moi, merci ! Je n'ai aucune idée pourquoi cela a fonctionné mais pas les autres.

0voto

Soumya Rajiv Points 11

C'est ce qui a fonctionné pour moi... Je n'ai pas utilisé curl.

J'ai pu accéder à une URL API particulière via le navigateur, mais lorsque je l'ai utilisée dans file_get_contents, j'ai obtenu l'erreur "échec de l'ouverture du flux".

Ensuite, j'ai modifié l'URL de l'API que je voulais appeler en encodant tous les guillemets doubles avec urlencoding et en laissant tout le reste inchangé.

Un exemple de format est donné ci-dessous :

$url = 'https://stackoverflow.com/questions'.urlencode('"'.$variable1.'"');

Ensuite, utilisez

file_get_contents($url);

0voto

psoucek Points 1

J'ai eu le même problème mais c'était un problème de pare-feu... une fois que j'ai ajouté le serveur API à la liste blanche, ça a fonctionné correctement, en utilisant à la fois get_file_contents($url) et la méthode curl ci-dessus...

Des heures perdues avant de découvrir le problème de règle de pare-feu.

0voto

user1132363 Points 1217

Pour moi, le problème était une valeur incorrecte dans l'en-tête Content-Length. La valeur était trop grande, donc nginx continuait d'attendre le reste du contenu qui n'est jamais arrivé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X