API Rest Explorer ... Questionnement

Bonsoir à toutes et à tous.

Pour une application que je développe, je vais avoir besoin de faire appel aux API Rest, et en particulier celle sur les tiers.

Donc, comme je suis curieux, j’ai commencé à utiliser l’explorer pour tester ce que je pouvais faire ou pas.

Et là, j’ai un problème, ou je ne sais pas m’en servir.

J’ai donc bien récupéré le token qui me permet d’ouvrir l’explorer.

Sur la partie GET, car je souhaite voir la liste de mes tiers, si je laisse une quelconque information dans le formulaire de paramètre et que je lance la requête le résultat est immédiat :

API not found (failed to include API file)

501

{
« pragma »: « no-cache »,
« date »: « Fri, 01 Nov 2019 22:05:13 GMT »,
« server »: « nginx »,
« x-powered-by »: « PHP/7.0.33 »,
« content-type »: « text/html; charset=UTF-8 »,
« status »: « 501 »,
« cache-control »: « no-store, no-cache, must-revalidate »,
« expires »: « Thu, 19 Nov 1981 08:52:00 GMT »
}

Bien sur, si je mets tous les champs à vide, je récupère tous mes tiers.

Je parle des GET pour obtenir une liste globale.
Et j’ai ça sur tous les formulaires .

Bon, je suis un peu noob alors, n’hésitez pas à me dire si ce n’est pas clair et surtout si c’est moi qui n’ais pas compris comment ça fonctionne (ce qui est possible).

Merci par avance pour toute info et aide.

JF

Bonjour @jeanfrancoisvarin,

A priori, le problème pourrait venir du serveur Web.
Dans certains cas, il ya des problèmes avec l’API REST lorsque le serveur Web utilisé est nginx.

Un patch a été passé dans le coeur et sera dispo à la prochaine version de maintenance.

La modif est ici si tu veux essayer et nous dire si cela règle le problème :wink:

Bonjour @jtraulle,

Merci déjà pour ta réponse et merci pour le patch, j’avais déjà essayé et je crois bien m’être planté à l’époque (il y a trois semaines).

Je viens donc de procéder aux modifs à la main.
Dans un premier temps, le résultat est meilleur mais rien n’est retourné, et ce quelque soit la méthode choisie.

Doutant de mes modifications, j’ai rechargé le fichier index.php du git et là, plus aucune API exposée hormis Login mais aucun token ne répond.

J’ai donc repris mon index.php d’avant les modifications pour obtenir la situation première.

Et là, même problème.

Response Body
no content
Response Code
200
Response Headers
{
« cache-control »: « no-cache, must-revalidate »,
« content-language »: « en-US »,
« content-length »: « 0 »,
« content-type »: « application/json; charset=utf-8 »,
« date »: « Mon, 11 Nov 2019 15:34:55 GMT »,
« expires »: « 0 »,
« pragma »: « no-cache »,
« server »: « nginx »,
« status »: « 200 »,
« x-powered-by »: « Luracast Restler v3.0.0rc6 »
}

Peut-être fais-je de mauvaises manips…

Si je peux aider, n’hésite pas à me dire comment.

Jean-François

Salut @jeanfrancoisvarin,

Si « rien n’est retourné », je te conseille vivement de regarder les logs d’erreur de php / php-fpm et/ou nginx car une page blanche est souvent synonyme d’erreur 500 et le détail de l’erreur sera consultable dans les journaux.

Quelle est la distribution GNU/Linux sur laquelle nginx est installé ? Ubuntu Server ? Debian ? CentOS ? Quelle version ?
Comment nginx a t-il été installé (dépôts de la distribution ou dépôts externes NGINX Inc.)

Bonjour,

J’ai peut être une nouvelle solution qui fonctionnerait sur tous les serveurs avec l’entrée REQUEST_URI manquante. Faire la mise à jour de la ligne dans la dernière réponse de ce lien:

En résumé:

For now, i’m trying to use this one at line 42 of index.php file in « api » folder and it’s working for me.

Change
$url = $_SERVER["SCRIPT_URI"] !== null ? $_SERVER["SCRIPT_URI"] : $_SERVER['PHP_SELF'];

to

$url = $_SERVER["SCRIPT_URI"] !== null ? $_SERVER["SCRIPT_URI"] : $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];

Bonjour,

Ce matin j’ai activé les API sur mon installation de Dolibarr. Je n’avais pas accès à l’explorer d’API.

J’ai trouvé ailleurs sur Internet une solution qui propose de changer la ligne 92 comme suit :
//preg_match(‹ /index.php/([^/]+)(.)$/‹ , $_SERVER[« PHP_SELF »], $reg); // L’ancienne ligne
preg_match( ›/index.php/([^/]+)(.
)$/ ›, $_SERVER[« REQUEST_URI »], $reg); // La nouvelle

J’ai enfin accès à l’explorer API mais je suis dans l’impossibilité de faire des requêtes GET vers les API.

Curl : curl -X GET --header ‹ Accept: text/html › --header ‹ DOLAPIKEY: MON_API › ‹ https://monurl/api/index.php/login?login=efzefzef&password=wsdfbgwdfb&entity=1 ›

Request URL : https://monurl/api/index.php/login?login=efzefzef&password=wsdfbgwdfb&entity=1

Response Body : API not found (failed to include API file)

Response Code : 501

Response Headers
{
[…]
« server »: « nginx »,
« status »: « 501 »,
« x-powered-by »: « PHP/7.4.1 »
}

Étrangement les requêtes GET, elles, semblent ne pas avoir de soucis :

Curl : curl -X POST --header ‹ Content-Type: application/json › --header ‹ Accept: application/json › --header ‹ DOLAPIKEY: MON_API › -d ‹ {
« login »: « string »,
« password »: « string »,
« entity »: « 1 »,
« reset »: 0
} › ‹ https://monurl/api/index.php/login ›

Request URL : https://monurl/api/index.php/login

Response Body
{
« error »: {
« code »: 403,
« message »: « Forbidden: Access denied »
},
[…]
}

Response Code : 403

Je ne retrouve pas la même chose en ligne 42, et ça me semble plus ou moins la même chose que j’ai ajouté au final… Je ne suis pas certains que cela change quoi que ce soit.

C’est le même problème selon toi ? Le fait que je ne retrouve pas cette ligne c’est normal ?

Salut,

quand tu dis « Je n’avais pas accès à l’explorer d’API », tu veux dire que tu avais une erreur ? Si oui, c’était quoi l’erreur ?

Car par défaut, l’explorer « https://tondomaine.ext/api/index.php/explorer/ » est censé fonctionner sans soucis.

Avant la modification il n’y a rien qui apparaissait dans la page des API.
Après, toutes les fonctionnalités apparaissent.

Bonjour est-il possible d’avoir la sortie du code suivant à mettre dans le fichier index.php en début du fichier par ex.

print_r( $_SERVER );
exit;

(N’hésites pas à cacher ton domaine mais pas les valeurs entières)

(edit : plus utile)
C’est tout …

Mince, je me trompe… je voulais plutôt la sortie de l’entrée $_SERVER.

(plus utile)

Voilà… Merci beaucoup.

L’entrée dans ce tableau qui peut permettre le debug est HTTP_HOST mais je comprend que tu la camoufle.

Je ne sais pas comment avancé, peut être par MP tu peux me communiquer sans camouflé les entrées ???

En faite ce serait bien de comparer les données de ce tableau « $_REQUEST » avec une requête GET sur api/index.php/explorer mais également quand tu tapes sur la routes pour afficher les produits depuis l’API par exemple:

J’ai l’impression que c’est le nom de domaine qui fait planter le module « mod_rewrite » quand nous avons un sous domaine. C’est qu’une hypothèse.

PS: Tu peux supprimer les données de ton ancien post, si jamais tu peux m’envoyer par MP les output ce serait vraiment bien pour avancer.

Je confirme que je suis bien sur un sous domaine.

Voilà la fameuse ligne qui fonctionne en testant avec vos configurations :slight_smile:

$url = $_SERVER["SCRIPT_URI"] !== null ? $_SERVER["SCRIPT_URI"] : $_SERVER['HTTP_HOST'] . preg_replace( '/(\?.+)/', '', $_SERVER['REQUEST_URI'] );

Je veux bien, mais sur Dolibarr 10.0.6 dans le fichier index.php du dossier api, je ne retrouve pas la variable $url dans le fichier.

41 - if (! $res && file_exists(« …/main.inc.php »)) $res=include ‹ …/main.inc.php ›;
42 - if (! $res) die(« Include of main fails »);
43
44 require_once DOL_DOCUMENT_ROOT.‹ /includes/restler/framework/Luracast/Restler/AutoLoader.php ›;

Je n’ose pas déposer cette ligne au hasard dans le fichier, sachant que cette variable n’est pas disponible dans le fichier d’origine.

Effectivement, ça n’est plus présent dans le code.

Peu importe, peux-tu tester de remplacer le fichier /api/index.php par ce contenu et me faire un retour: https://gist.github.com/eoxia-jimmy/0521c23323c2af3e9ccab07c93a1b1ad

1 « J'aime »

« error »: {
« code »: 403,
« message »: « Forbidden: Access denied »
},

C’est beaucoup mieux. Toutes les api répondent.

C’est donc bien ce fameux problème de variable de serveur web qui ne répond pas comme elle le devrait ? Si effectivement un « fix » côté serveur n’est pas envisageable cette modification serait bienvenue.
J’ai cru comprendre que tu as déjà proposé ces modifications sur le github de Dolibarr et donc que, potentiellement, ce fix devrait prochainement être mis en place.

Entre temps il va falloir que je surveille les mise à jour si je ne m’abuse.

Merci beaucoup @Laygen pour ton temps et ton aide !

1 « J'aime »