Page 1 sur 1

web service REST et format retour JSON

Posté : jeu. 06 déc. 2018, 16:00:10
par thomas.barberot
Bonjour.
J'ai déployé un *SRVPGM sous forme de web service REST. sur les méthodes, j'ai indiqué un "Returned output media type" à "*XML_AND_JSON".
Dans "request information", dans la partie "HTTP Headers", j'ai ajouté la valeur "CONTENT-TYPE".

D'après ce qui est écrit ici, il faut fixer la variable d'environnement "CONTENT_TYPE" pour indiquer le format voulu.

J'ai donc fait le code suivant afin de récupérer la valeur du header content-type pour alimenter la variable d'environnement avec :

Code : Tout sélectionner

dcl-pr GetEnvVar extproc('QtmhGetEnv');
 *n char(100);
 *n int(10) const;
 *n int(10);
 *n char(100) const;
 *n int(10) const;
 *n char(100);
end-pr;

dcl-pr PutEnvVar extproc('QtmhPutEnv');
 *n char(100);
 *n int(10) const;
 *n char(100);
end-pr;

dcl-s lRetour char(100) inz;
dcl-s lRetourLen int(10) inz;
dcl-s lErreurApi char(100) inz;
dcl-s lString char(100) inz;

GetEnvVar(lRetour:%len(lRetour):lRetourLen:'HTTP_CONTENT-TYPE':17:lErreurApi);
lString = 'CONTENT_TYPE=' + %trim(lRetour);
PutEnvVar(lString:%len(lString):lErreurApi);
Je récupère bien la variable d'environnement HTTP_CONTENT-TYPE, je mets bien "application/json" dans la variable CONTENT_TYPE, et pourtant, le service renvoie du XML.

Si je force "Returned output media type" à "*JSON" au déploiement du service, j'ai bien du JSON en retour (c'était pour être sûr).

Que me manque-t'il pour avoir, au choix, du XML ou du JSON ?
Merci.

accept

Posté : jeu. 06 déc. 2018, 17:21:19
par cmasse
Content_type permet au serveur de d'indiquer dynamiquement le format qu'il retourne (CSV ou HTML, par exemple).

quand le serveur prévoit *XML_AND_JSON, c'est au client de dire ce qu'il préfère par le biais de "Accept"

https://httpd.apache.org/docs/2.2/fr/co ... ation.html

(sujet inconnu)

Posté : ven. 07 déc. 2018, 09:06:26
par thomas.barberot
J'ai modifié le web service pour n'avoir que "accept" dans la liste des HTTP headers, je n'ai plus de gestion de variable d'environnement dans le RPG (plus de getenv, plus de putenv), et ça fonctionne bien (xml ou json selon la valeuur passé en header dans "accept").

Du coup, je ne comprends pas dans quel cas il faut appliquer ce que vous écrivez sur votre tuto :
Avec SI56883, vous pouvez préciser plusieurs types de média en retour et le type est libre (text/html, par ex.). Il faut alors fixer la variable d'environnement CONTENT_TYPE pour préciser dynamiquement le type retourné à chaque appel.
Et est-ce que cela fait doublon avec le paramètre (optionnel) contenant la liste des header ? Si oui, quelle est la solution à privilégier (variable d'environnement ou paramètre) ?

Merci.

(sujet inconnu)

Posté : ven. 07 déc. 2018, 11:43:18
par nbonnet
Salut Thomas,

Il est possible de contrôler dynamiquement le type de contenu retourné par un service web. Cela nécessite un paramètre supplémentaire au programme/procédure permettant d'injecter des entêtes HTTP dans la réponse, et il faut avoir indiqué au déploiement les types possibles.

un exemple ici :
https://www.gaia.fr/retourner-des-docum ... -services/

a+