[résolu] Mutualisé OVH impossible de faire fonctionner Swagger

Bonjour à tous,

Même pb sur une v20 et une v21. Précision importante, je parle d’un dolibarr hébergé en mutualisé chez OVH dans un sous-dossier d’un site wordpress.

Après des heures passées à écumer les forums et tester un tas de choses différentes je pense bientôt rendre les armes :frowning:

Quand je me connecte à https:/monsite/htdocs/api/index.php/explorer et que j’entre ma clé, Swagger ne retourne aucune entrée. Tout est correctement configuré (main_url-root ok ainsi que tout ce que j’ai vu qu’il fallait faire), j’ai aussi désactivé le gzip et tenté un tas de choses mentionnées par des gens qui rencontraient le même problème, mais rien à faire, le swagger reste désespérément vide.

J’ai modifié le .htaccess à la racine avec le rewriting pour wordpress en excluant le dossier contenant dolibarr mais ça n’a rien changé.

J’arrive bien à me connecter à l’API avec Postman et après des heures passées sur le dossier j’ai la quasi certitude que tout fonctionne bien à l’exception de l’utiilsation de Swagger (ce qui est moche quand on veut pouvoir se familiariser avec l’API ^^).

Je ne vais pas alourdir trop le post en expliquant tout ce que j’ai pu trouver et ce qui n’a pas marché mais je dois vous avouer qu’après y avoir passé autant de temps j’ai l’impression que je vais abandonner l’idée de pouvoir utiliser l’API Dolibarr :confused: J’ai fait une résinstall fraiche pour m’assurer que ce ne sont pas toutes les bidouilles que j’ai faites qui posaient ensuite problème mais j’ai toujours cette même page vide, elle fonctionne mais ne retourne rien. Je peux cliquer sur « Explore » en renseignant ma clé, le base URL indique bien le bon chemin vers mon install monchemin/htdocs/api/index.php mais aucun endpoint n’est indiqué.
J’imagine qu’il y a une spécificité liée à l’hébergement chez OVH mais là je sèche vraiment. J’ai lui plusieurs topics qui traitent du même pb mais il semblerait qu’un correctif ait été apporté sur la v20 depuis et je suis sur la dernière version (20.4).
Bref, si une âme charitable avait une idée et ce qui peut poser pb et pouvait m’aider ce serait très bienvenu car je suis en train de sombrer dans la dépression ^^

En vous remerciant de m’avoir lu et en vous souhaitant une bonne journée à tous :slight_smile:

Bonjour,

Essayez l’url du swagger directement dans un navigateur et ouvrez la console pour voir la réponse renvoyée /api/index.php/explorer/swagger.json cela devrait vous donner des pistes.

Vous n’avez pas besoin de clé pour tester, vous devez au minimum avoir la méthode login

Merci bcp pour cette réponse très rapide Beers :slight_smile: J’ai modifié dans /api/index.php

// Détermination de l'URL de base
$url = $_SERVER['SCRIPT_NAME'] . (isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '');

if (preg_match('/api\/index\.php$/', $url)) {
    $url = $_SERVER['PHP_SELF'] . (empty($_SERVER['PATH_INFO']) ? $_SERVER['ORIG_PATH_INFO'] : $_SERVER['PATH_INFO']);
}
if (getDolGlobalString('MAIN_NGINX_FIX')) {
    // Forcer l'URL de base en se basant sur HTTP_HOST et REQUEST_URI (sans query string)
    $url = 'https://' . $_SERVER['HTTP_HOST'] . preg_replace('/(\?.+)/', '', $_SERVER['REQUEST_URI']);
}
par :
// Détermination de l'URL de base
$url = $_SERVER['SCRIPT_NAME'] . (isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '');

// Si le paramètre MAIN_NGINX_FIX est activé, forcer l'URL de base en se basant sur HTTP_HOST et REQUEST_URI (sans la query string)
if (getDolGlobalString('MAIN_NGINX_FIX')) {
    $url = 'https://' . $_SERVER['HTTP_HOST'] . preg_replace('/(\?.+)/', '', $_SERVER['REQUEST_URI']);

Ca m’a fait apparaitre « login », j’ai exécuté la requête avec mes id et ça m’a bien retourné ma clé. Quand je l’ai recopiée (c’était pourtant déjà la même) j’ai maintenant « documents », « login » « setup » « status » qui apparaissent. Mais pas de « invoices » « thirdparties », etc. L’utilisateur API est admin a bien tous les droits sur tous les modules et ils sont bien activés.
" /api/index.php/explorer/swagger.json" me retourne "

|||
| --- | --- |
|swagger|"2.0"|
|host|"monsite.com"|
|basePath|"/sousdossier/htdocs/api/index.php"|
|produces||
|0|"application/json"|
|1|"application/xml"|
|consumes||
|0|"application/json"|
|1|"application/xml"|
|2|"multipart/form-data"|
|paths||
|/testapi/test||
|get||
|operationId|"testApiRetrieveTest"|
|tags||
|0|"testapi"|
|parameters|[]|
|summary|"Méthode de test qui renvoie un message simple 🔓"|
|description|""|
|responses||
|200||
|description|"Success"|
|schema||
|type|"array"|
|items||
|type|"string"|
|/login||
|get||
|operationId|"loginLoginUnsecured"|
|tags||
|0|"login"|
|parameters||
|0||
|name|"login"|
|type|"string"|
|description|"User login"|
|in|"query"|
|required|true|
|1||
|name|"password"|
|type|"string"|
|description|"User password"|
|in|"query"|
|required|true|
|2||
|name|"entity"|
|type|"string"|
|description|"Entity (when multicompany module is used). '' means 1=first company."|
|in|"query"|
|required|false|
|3||
|name|"reset"|
|type|"integer"|
|format|"int64"|
|description|"Reset token (0=get current token, 1=ask a new token and canceled old token. This means access using current existing API token of user will fails: new token will be required for new access)"|
|in|"query"|
|required|false|
|summary|"Login 🔓"|
|description|'Request the API token for a couple username / password. WARNING: You should NEVER use this API, like you should never use the similar API that uses the POST method. This will expose your password. To use the APIs, you should instead set an API token to the user you want to allow to use API (This API token called DOLAPIKEY can be found/set on the user page) and use this token as credential for any API call. From the API explorer, you can enter directly the "DOLAPIKEY" into the field at the top right of the page to get access to any allowed APIs.'|
|responses||
|200||
|description|"Success"|
|schema||
|type|"array"|
|items||
|type|"string"|
|403||
|description|"Access denied"|
|500||
|description|"System error"|
|post||
|operationId|"listLogin"|
|tags||
|0|"login"|
|parameters||
|0||
|name|"listLoginModel"|
|description|"**login** (required) \n**password** (required) \nentity \nreset \n"|
|in|"body"|
|required|true|
|schema||
|$ref|"#/definitions/listLoginModel"|
|summary|"Login 🔓"|
|description|'Request the API token for a couple username / password. WARNING: You should NEVER use this API, like you should never use the similar API that uses the POST method. This will expose your password. To use the APIs, you should instead set an API token to the user you want to allow to use API (This API token called DOLAPIKEY can be found/set on the user page) and use this token as credential for any API call. From the API explorer, you can enter directly the "DOLAPIKEY" into the field at the top right of the page to get access to any allowed APIs.'|
|responses||
|200||
|description|"Success"|
|schema||
|type|"array"|
|items||
|type|"string"|
|403||
|description|"Access denied"|
|500||
|description|"System error"|
|definitions||
|listLoginModel||
|properties||
|login||
|type|"string"|
|description|"User login"|
|password||
|type|"string"|
|description|"User password"|
|entity||
|type|"string"|
|description|"Entity (when multicompany module is used). '' means 1=first company."|
|reset||
|type|"integer"|
|format|"int64"|
|description|"Reset token (0=get current token, 1=ask a new token and canceled old token. This means access using current existing API token of user will fails: new token will be required for new access)"|
|required||
|0|"login"|
|1|"password"|
|securityDefinitions||
|api_key||
|type|"apiKey"|
|name|"api_key"|
|in|"query"|
|info||
|version|"1"|
|title|"Restler API Explorer"|
|description|"Live API Documentation"|
|contact||
|name|"Restler Support"|
|url|"luracast.com/products/restler"|
|email|"[email protected]"|
|license||
|name|"LGPL-2.1"|
|url|"https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html"|"

On y voit qu’il ne trouve aucun « path ». Ne pas faire attention à la mention à « test » j’ai fait une tentative avec un fichier test quand rien n’apparaissait. En fait le swagger répond bien mais il ne trouve aucun endpoint, j’ai l’impression que c’est un pb de chemin mais pour le coup ça fait un moment que je l’ai perdu mon chemin :confused:

J’ai repris le /api/index.php original de la v21 et remplacé

`$url = $_SERVER['PHP_SELF'];
if (preg_match('/api\/index\.php$/', $url)) {	// sometimes $_SERVER['PHP_SELF'] is 'api\/index\.php' instead of 'api\/index\.php/explorer.php' or 'api\/index\.php/method'
	$url = $_SERVER['PHP_SELF'].(empty($_SERVER['PATH_INFO']) ? $_SERVER['ORIG_PATH_INFO'] : $_SERVER['PATH_INFO']);
}
// Fix for some NGINX setups (this should not be required even with NGINX, however setup of NGINX are often mysterious and this may help is such cases)
if (getDolGlobalString('MAIN_NGINX_FIX')) {
	$url = (isset($_SERVER['SCRIPT_URI']) && $_SERVER["SCRIPT_URI"] !== null) ? $_SERVER["SCRIPT_URI"] : $_SERVER['PHP_SELF'];
}`

par

"// Détermination de l'URL de base en se basant sur la configuration
$url = $dolibarr_main_url_root . 'api/index.php' . (isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '');

// Si MAIN_NGINX_FIX est activé (utile même sous Apache sur OVH), forcer le calcul via HTTP_HOST et REQUEST_URI sans la query string
if (getDolGlobalString('MAIN_NGINX_FIX')) {
    $url = 'https://' . $_SERVER['HTTP_HOST'] . preg_replace('/(\?.+)/', '', $_SERVER['REQUEST_URI']);
}"

et finalement tout s’affiche bien. A priori j’avais mis trop de bazar dans mon index.php. Bref, toutes les lignes apparaissent bien maintenant. J’espère que ça pourra être utile à quelqu’un d’autre qui se retrouve coincé sur un mutualisé OVH pour accéder à Swagger :slight_smile: