Erreur de récuperation de données depuis une API (HTTPS) avec PHP cUrl

Samsss
Invité n'ayant pas de compte PHPfrance

17 mai 2019, 16:53

Bonjour,

Actuellement en train de réaliser un projet, je dois extraire des données (localisation et Kilométrage, non exhaustif) depuis une API de localisation de voitures, qui suit le protocole HTTPS. Pour cela, je suis en train de travailler sur un script PHP me permettant :
- D'accéder à l'API (avec l'identifiant et le mdp)
- Récupérer les informations relatives aux véhicules en Json.
Malheureusement après de nombreuses tentatives je n'y arrive toujours pas... J'obtiens une réponse du style :
- - -
HTTP/1.1 100

HTTP/1.1 405
X-Application-Context: application:ma:8092
Allow: GET
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Content-Length: 0
Date: Fri, 17 May 2019 14:42:53 GMT
Strict-Transport-Security: max-age=15768000; includeSubDomains
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
- - -

Voici mon code :
<?php

 //url : https://api.stgfleet.com/positions/42898?dateFrom=2019-05-01&dateTo=2019-05-17  

 // creer la resource curl 
 $ch = curl_init();

 //$header = array('Content-Type: application/json');

 curl_setopt($ch,CURLOPT_URL,'https://api.stgfleet.com/positions/42898?dateFrom=2019-05-01&dateTo=2019-05-17');
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 curl_setopt($ch, CURLOPT_USERPWD, "XxxX:pwd");
 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
 curl_setopt($ch,CURLOPT_POST,1);
 curl_setopt($ch, CURLOPT_HEADER,1); 

 $response = curl_exec($ch);


 echo '<pre>';
 print_r($response);
 
 curl_close($ch);
 

?>

Pouvez vous me donner des pistes de réflexion pour régler ça ?

Merci d'avance.

Avatar du membre
Mammouth du PHP | 951 Messages

17 mai 2019, 17:02

Salut, pour le peu que je vois tu as un code HTTP 405 qui correspond à l'erreur "Method Not Allowed" et tu as un Allow: GET, alors peut être qu'en passant simplement ta requête en méthode GET avec un curl_setopt($ch,CURLOPT_POST, 0); au lieu de 1.
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8218 Messages

17 mai 2019, 17:32

Si dans un navigateur web en navigation privée tu vas sur l'url :
https://LOGIN:MOTDEPASS@api.stgfleet.co ... 2019-05-17
(en mettant bien évidemment le bon login et mdp)

Est-ce que tu as bien les données voulues ?

Si oui, alors le plus simple c'est même d'utiliser la fonction file_get_contents() plus besoin de s'embéter avec Curl : :D
<?php
$json = file_get_contents('https://LOGIN:MOTDEPASS@api.stgfleet.com/positions/42898?dateFrom=2019-05-01&dateTo=2019-05-17');
var_dump($json);
Quand tout le reste a échoué, lisez le mode d'emploi...

Samsss
Invité n'ayant pas de compte PHPfrance

17 mai 2019, 17:33

Salut,

Merci de cette réponse rapide, néanmoins en remplacant le 1 par 0 j'obtiens une autre erreur qui est :
- - -
HTTP/1.1 415
X-Application-Context: application:ma:8092
Accept: application/vnd.telefleet-v1+json, application/vnd.telefleet-v1+xml, application/v1+json, application/v1+xml, application/x-www-form-urlencoded
Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
Content-Length: 0
Date: Fri, 17 May 2019 15:07:36 GMT
Strict-Transport-Security: max-age=15768000; includeSubDomains
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-XSS-Protection: 1; mode=block
- - -

Après une petite recherche, j'ai trouvé que c'était un pb de format, ce que je n'ai pas très bien compris ..

Samsss
Invité n'ayant pas de compte PHPfrance

17 mai 2019, 17:39

Salut @rthur,

Merci de ta réponse. Mais après avoir essayé le lien je n'obtiens rien.. Page blanche

Avatar du membre
Mammouth du PHP | 951 Messages

17 mai 2019, 17:42

D'après ce que je comprends de l'erreur 415, il faudrait peut être que tu définisses certains headers.
https://developer.mozilla.org/fr/docs/W ... Status/415

L'API ne vient-elle pas avec une documentation et des exemples de code php ?
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

Samsss
Invité n'ayant pas de compte PHPfrance

17 mai 2019, 17:43

Salut saveus,

Dans mon code j'ai normalement donné les creditentials nécessaires pour se connecter. Mais si cUrl ne peut pas, alors qu'est-ce que je dois utiliser ??

Avatar du membre
Mammouth du PHP | 951 Messages

17 mai 2019, 17:46

Soyons fous ^^
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json'
));

PS : il semblerait que ce soit comme avec l'autre requête tu as une ligne Accept qui liste probablement les content type acceptés :
Accept: application/vnd.telefleet-v1+json, application/vnd.telefleet-v1+xml, application/v1+json, application/v1+xml, application/x-www-form-urlencoded
Alors si application/json ne fonctionne pas tu peux tester aussi le application/vnd.telefleet-v1+json ou application/v1+json
J'édite souvent mon message après avoir répondu pour le corriger où y apporter des informations complémentaires alors n'hésitez pas à y jeter un nouveau coup d'oeil ^^

Avatar du membre
Eléphanteau du PHP | 19 Messages

17 mai 2019, 17:55

ca ressemble a de l'authentification HTTP.
essaye peu être :
http://oseox.fr/curl/authentification-http.html
EX Administrateur infogérence infrastructure web.( chaine de télévision ; et autre site a données sensibles). Très bonne connaissance en : routeur , firewall ,switch , serveur linux ubuntu ,apache , php, mysql (y compris master-slave), et bien d'autre technologies. Pratiquant le php assez regulierement , depuis la version 3.0 ,surtout comme langage de script ,tel que pour redémarrer des services windows via une interface web. Cherchant a se reconvertir ,suite a un Burn-out ,dans le dev php-mysql ,sur paris,RP-ouest.

Samsss
Invité n'ayant pas de compte PHPfrance

17 mai 2019, 17:56

Salut Saian,

Comme tu l'avais pressenti, l'erreur venait bien des headers, du coup après quelques recherches j'ai pu modifier mon code et accéder aux infos que je voulais. ps : je viens de remarquer que l'id que j'avais mis était faux aussi !!!
code :
<?php
  
$AUTH1 = 'XxxxX:pwd';  
	$ACCEPT = 'application/vnd.telefleet-v1+json';

	 //Header
	 $Header_array1 = array(
		"Authorization: Basic ".base64_encode($AUTH1),
		"Content-Type: ".$ACCEPT
		);
 // creer la resource curl 
 $ch = curl_init();

 curl_setopt($ch,CURLOPT_URL,'https://api.stgfleet.com/positions/72077?dateFrom=2019-05-15&dateTo=2019-05-17');
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
 curl_setopt($ch,CURLOPT_POST,0);
 curl_setopt($ch, CURLOPT_HTTPHEADER,$Header_array1); 

 $response = curl_exec($ch);


 echo '<pre>';
 print_r($response);
 
 curl_close($ch);
 

?>

Je te remercie infiniment :!: :!:

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 8218 Messages

17 mai 2019, 17:57

Cette API doit forcément avoir une documentation, demande là si tu ne l'a pas déjà car ça ira plus vite que de bidouiller jusqu'à trouver un bout de code où ça "tombe" en marche ;-)
Quand tout le reste a échoué, lisez le mode d'emploi...