web service REST et format retour JSON

configuration Apache, Zend et PHP , Web services
Répondre
thomas.barberot
Messages : 58
Enregistré le : jeu. 12 avr. 2012, 14:50:53

web service REST et format retour JSON

Message 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.

cmasse
Site Admin
Messages : 813
Enregistré le : mer. 14 févr. 2007, 18:00:03
Localisation : Nantes
Contact :

accept

Message 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
Christian Massé (Volubis.fr)

thomas.barberot
Messages : 58
Enregistré le : jeu. 12 avr. 2012, 14:50:53

(sujet inconnu)

Message 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.

nbonnet
Messages : 198
Enregistré le : mar. 11 sept. 2018, 08:20:13
Localisation : Lyon

(sujet inconnu)

Message 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+
Nathanaël

Répondre