Erreur API REST sans modifier le code

Bonjour,

Je me tourne vers vous car j’ai régulièrement une erreur lorsque j’envoi un requète à l’API REST. J’utilise HTTPFUL et j’avoue que c’est la première fois que je développe un script utilisant l’api rest.

Je lance une première fois la synchronisation, et je me retrouve avec cette erreur:

[13-Dec-2017 15:40:57 UTC] error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol [13-Dec-2017 15:40:57 UTC] PHP Fatal error: Uncaught Httpful\Exception\ConnectionErrorException: Unable to connect to "https://XXXX.com/api/index.php/dictionarycountries?sortfield=code&sortorder=ASC&limit=100&sqlfilters=(t.code%3Alike%3A%27FR%27)&DOLAPIKEY=xxxxxxxxxxxxxxxxxxxf": 35 error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol in phar: httpful.phar/Httpful/Request.php:208 Stack trace: #0 Httpful\Request->send() #1 dolibarr->country_id_from_name('FR') #2 customers_synchonisation() in phar: httpful.phar/Httpful/Request.php on line 208

Je relance une seconde fois sans rien changer, et là miracle ça fonctionne parfaitement.

[13-Dec-2017 15:41:16 UTC] Reponse Dictionarycountries:<?xml version="1.0" encoding="UTF-8"?> <response> <item> <id>1</id> <code>FR</code> <code_iso>FRA</code_iso> <label>France</label> <active>1</active> </item> </response> [13-Dec-2017 15:41:16 UTC] socid:11

Voici le bout de code en question:

function country_id_from_name($country_name){ $uri = "https://xxxxxxxx.com/api/index.php/dictionarycountries?sortfield=code&sortorder=ASC&limit=100&sqlfilters=(t.code%3Alike%3A%27".$country_name."%27)&DOLAPIKEY=xxxxxxxxx; $response = \Httpful\Request::get($uri)->withoutStrictSSL()->expectsXml()->send(); error_log('Reponse Dictionarycountries:'.$response); return (string)$response->body->item->id; }

Si quelqu’un a une idée pour faire disparaître cette erreur…

Merci beaucoup!

Bonjour,

Toujours à la recherche d’une solution concernant ce problème. Je remarque que c’est essentiellement sur les requêtes de type GET.
Pour être sûr que cela ne vient pas de HTTPFUL, j’ai testé avec la fonction du wiki.
Et j’ai testé avec une autre requête, à savoir:

$uri = "https://XXXX.com/api/index.php/thirdparties"; $companySearch = $this->CallAPI("GET", "MONAPIKEY" , $uri, array( "sortfield" => "t.rowid", "sortorder" => "ASC", "limit" => "100", "mode" => "1", "sqlfilters" => "(t.nom:=:'TOTO')" ) );

Et là, même problème. Sans changer le code, une fois ça fonctionne, l’autre d’après je n’ai pas de réponse.
Le seul remède que j’ai trouvé pour le moment et de faire

$success = 0;
while($success == 0){
   $reponse = // faire la requête
  if(!empty($reponse)) $success=1;
}

C’est du bricolage et ça ne me plait pas trop…

J’ai un VPS info-géré et je suis sous apache et PHP7.1. aucune amélioration sous PHP5.6 ou 7.0.

Quelqu’un aurait-il une autre solution?

Si aucune solution, je pense que je vais finir par me connecter directement à la base de données dolibarr depuis mon module woocommerce et utiliser du bon vieux sql.

Cordialement.

Bonjour,

C’est quoi la réponse du Headers sur /api/index.php/explorer

J’utilise la méthode du wiki et aucun problème, vu ton message on dirait une erreur du openssl genre il se mélange les pattes avec le http/https

error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

Bonjour Doudouvs,

Dans l’explorer j’arrive juste à afficher les méthodes avec la clé api. Les méthodes ne fonctionnent pas directement. J’ai fait pas mal de recherche, je n’ai jamais trouvé pourquoi. Et vu que ça semblait fonctionner en passant par un script, ça ne me dérangeait pas plus que ça.

Je ne sais pas ce que tu entends par réponse du header, mais je suppose que c’est ça:

HTTP/1.1 304 Not Modified
Date: Sat, 16 Dec 2017 18:22:09 GMT
Server: Apache/2.4.25 (Debian)
Expires: 0
Cache-Control: no-cache, must-revalidate
Vary: Accept
Strict-Transport-Security: max-age=16000000; includeSubDomains; preload

Je précise que j’accède à la page avec une adresse en https.

Je ne sais pas si ça a un intérêt mais sur la page /api/index.php/explorer, j’ai ceci:
[ base url: https://monsite.com/api/index.php/explorer/resources.json , api version: 1 ]

Et sans indiquer la clé, je clique sur « raw » et je vois ceci:

[code]
« basePath »:« http://monsite.com/api/index.php »[/code

C’est bien ce que je dis, un mélange de http/https.

le « raw » te répond que « basePath » c’est en http

Test ton site en http

http://tonsite.com/api/index.php/explorer/

Donc pour moi une fois il marche car tu fait en http et l’autre il marche pas car tu fait du https

ps: dans l’exemple du wiki et HTTPFUL il n’utilise pas de HTTPS

Je suis un peu septique dans le sens où ça fonctionne, puis ne fonctionne plus, SANS changer le code. Que ce soit par httpful ou l’exemple du wiki. Mais, je vais quand même tenter de régler ce problème pour être sûr.

Saurais tu, d’ailleurs, comment régler l’API afin qu’il soit paramétré en https ?

Je me réponds à moi même. Ça se passe dans le fichier de configuration conf.php. La variable $dolibarr_main_url_root était renseigné en http au lieu de https, et la variable $dolibarr_main_force_https à 1 que j’ai laissé tel quel.

Grâce à cette petite correction, l’api explorer fonctionne! Je vais maintenant voir ce que cela donne à distance depuis mon module woocommerce…

C’était bien ça le problème. Si $dolibarr_main_url_root n’est pas en https, ça provoque une confusion dans l’API REST même si on force le HTTPS avec la variable $dolibarr_main_force_https à 1, et qu’on envoi les requêtes en https.

Ne me demandez pas pourquoi j’avais mis $dolibarr_main_url_root en http au lieu de https …

Problème résolu!