Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

Services Web

Sommaire
maxLevel7
minLevel1

Ancre
Top_of_Service_htm
Top_of_Service_htm

Service

Définition
Un service Web est un composant applicatif accessible sur le Web par une interface standard en utilisant des protocoles de communication basés sur le XML indépendamment du système d'exploitation et des langages de programmation utilisés.
Le service Web met à disposition des fonctions (méthodes) sur un serveur HTTP.
Le client du service Web peut invoquer la méthode du serveur aussi simplement que s'il s'agissait d'une fonction locale. Il faut spécifier l'URL du service Web auquel on désire accéder, ainsi que les paramètres d'entrée de la méthode.
WebServiceDIva
WebServiceDiva est une méthode générique permettant d'exécuter une action sur le serveur Web. L'action correspond à un programme Diva. Celui-ci récupère les paramètres (généralement une chaîne <hmp>), effectue le traitement et renvoie un résultat.
Le service est exécuté par le serveur HTTP IIS de Microsoft.

Ancre
Top_of_Architecture_htm
Top_of_Architecture_htm

...


Ancre
Top_of_DivaltoWebService_htm
Top_of_DivaltoWebService_htm

WebServiceDiva

WebServiceDiva est un service Web générique qui sert à lancer tous les services Web Diva. La page générique WebserviceDiva.asmx est hébergée sur le serveur IIS de Microsoft. Elle contient la méthode WebServiceDiva qui permet d'exécuter un programme Diva sur le serveur en lui passant des paramètres
Int WebServiceDiva(string action,string param,out string retour)

...


Il peut être appelé depuis un programme Diva et depuis n'importe quelle autre application cliente de services Web.
Il exécute le programme XWebServices.dhop
Remarque :
Pour l'appel d'un service Web Diva depuis un programme Diva il faut utiliser la fonction WebServiceDivaExecute.

Ancre
Top_of_XwebServices_htm
Top_of_XwebServices_htm

XwebServices

Le programme XwebServices.dhop est exécuté à chaque invocation d'un service Web Diva. C'est lui qui lance le programme Diva correspondant à l'action demandée.
Le programme de traitement de l'action est lancé par la fonction ProgramGoto. XwebServices.dhop lui envoie les paramètres par le tunnel.
Actions des services Web
Le paramètre <Action> permet de préciser l'action à exécuter pour ce message. Ce paramètre est obligatoirement une chaîne HMP dans laquelle le paramètre <ACTION> définit le traitement à effectuer. Il fait référence à une action décrite dans le fichier paramètres des actions. Ce fichier contient pour chaque action :

...


Voir également :
Rubrique "Harmony Markup Parameters HMP" de la documentation Xwin - Programmation.
Rubrique "Tunnels" de la documentation Xwin - Programmation.
Rubrique "ProgramCall" de la documentation Xwin - Programmation.

Ancre
Top_of_Service_Web_Diva_htm
Top_of_Service_Web_Diva_htm

Service Web Diva

Le service Web Diva est le programme chargé d'exécuter l'action demandée par le client du service Web.
Il récupère dans le tunnel par la fonction PingReceive les paramètres suivants :

...

Ancre
Top_of_Services_Web_residents_ht
Top_of_Services_Web_residents_ht

Services Web résidents

Principe
A partir de la version 6.3a d'Harmony, le système gère un pool de tâches pour l'exécution des services web. Ce pool permet de garder des tâches Harmony en attente et ainsi de réduire considérablement le temps d'exécution d'une requête.
Lors du premier appel à un service web, le programme XwebServices.dhop est chargé. Une fois le traitement de l'action effectué, le contrôle est rendu au programme XwebServices.dhop (par l'instruction ProgramGoto). Ce dernier se met alors en attente d'un appel de service web.
Lors de l'appel suivant à un service web, s'il existe une tâche disponible dans le pool, celle-ci est immédiatement activée.
Mise en oeuvre

...


Ancre
Top_of_Service_Xtelnet_htm
Top_of_Service_Xtelnet_htm

Programmation service web ou webhook : paramètre en entrée et sortie

L’exemple ci-dessous illustre la récupération en entrée dans un programme Diva des paramètres pour un service web ou un webhook, et les paramètres de retour

Bloc de code
languagec
;___________________________________________________________________________
;Description : Envoie la quantité en stock pour une référence article
;___________________________________________________________________________
module "ysystemex.dhop"
module "xwebservices.dhop"
public record	ddsys.dhsd Action Bal
define Vers = "2023"
1 WebServiceAction  64
1 ParamAction       256
1 ParamEntree	    S
1 ParamEntreeUnicode  S
1 WebServiceWebhook   40  =  " " 
1 WebServiceWebhookCode 256 = " "  
1 WebServiceWebhookParamHMP 256 = " " 
1 commProvenantDuFichierXbalwebHook 75 = " " 
1 cappelProvenantDuFichierXbalwebHook 16 =  " "
1 moderaw                       3
1 WebServiceWebhookRaw          S
1 WebServiceWebhookBody         S
1 WebServiceWebhookHeaders      S
1 WebServiceWebhookContentType  256
1 WebServiceWebhookParamsRaw	s
1 WebServiceWebhookEncodingType 256
1 WebServiceTypeTransport    10
1  WebServiceCommAction      256
1  paramsortie               S
1  paramsortiehh             S
1  CodeHttpResponse          4,0
1 	dos                      3,0
1 	ref 		             25
1 	stock 	                12,D2
1  carreste                 L
1 szAuthorization 4096

procedure RecupererLesParametresEnEntree
beginp
  ;	récupération des paramètres d'entrée
  PingReceive("WebServiceParameters",ParamEntree) 
  ParamEntree = Fromutf8toAnsi(left(ParamEntree),carreste,0)
  
  PingReceive("WebServiceParametersUnicode",ParamEntreeUnicode) ;idem en unicode mais je sais pas trop a quoi ca peut servir en diva 
  PingReceive("WebServiceAction",WebServiceAction)    ; nom de l'action exemple "STOCK"
  PingReceive("WebServiceTypeTransport",WebServiceTypeTransport)   ;type de service contenant le texte "soap","rest","webhook"
  PingReceive("WebServiceWebhook" ,WebServiceWebhook )		;numero du webhook  exemple F856B712803445A39E098456442C1EDC0C050A0C
  PingReceive("WebServiceWebhookCode"  ,WebServiceWebhookCode)	; la suite apres les 40 caracteres du webhook exemple F856B712803445A39E098456442C1EDC0C050A0Ctoto => on récupere "toto" (tel qu'il et écrit donc avec la case)
  
  ;infos provenant de la fiche webhook qui est dans le fichier xbalwebhook.dhfi/dhfd
  
  PingReceive("WebServiceWebhookParamHMP" ,WebServiceWebhookParamHMP )	 ;champ parametre hmp 
  PingReceive("WebServiceWebhookComm" ,commProvenantDuFichierXbalwebHook  ) 	 ;champ commentaire par exemple on peut le mettre dans du debug pour faire une trace 
  PingReceive("WebServiceWebhookCodeAppelant",cappelProvenantDuFichierXbalwebHook)  ;champ code d'appel , par exemple on peut y mettre un nom de  ste 
  
  ;infos provenant de la fiche ACTION qui est dans le fichier xbal.dhfi/dhfd
  PingReceive("WebServiceParamAction",ParamAction) ;param de l'action attention ne pas confondre avec WebServiceParameters 
  PingReceive("WebServiceCommAction,",WebServiceCommAction)   ;commentaire de la fiche action , pour mettre dans du debug par exemple, ne pas confondre avec WebServiceWebhookComm
  PingReceive("WebServiceWebhookContentType" ,WebServicewebhookContentType)		;exemple "application/json"
  PingReceive("WebServiceWebhookEncodingType",WebServiceWebhookEncodingType)  ;type d'encodage en general il contiens "UTF-8" ay milleu du texte donc faire string("UTF-8")  et a= "UTF-8"
  PingReceive("WebServiceWebhookBody" , WebServiceWebhookBody)				;c'est le body tel qu'on le recoit sans aucune transformation 
  WebServiceWebhookBody= Fromutf8toAnsi(left(WebServiceWebhookBody),carreste,0)
  PingReceive("WebServiceWebhookHeaders" , WebServiceWebhookHeaders)				  ;entetes au format hmp valeur etc 
  WebServiceWebhookHeaders= Fromutf8toAnsi(left(WebServiceWebhookHeaders),carreste,0)
  PingReceive("WebServiceWebhookRaw" ,WebServiceWebhookRaw)					;c'es un flag a 1 pour dire que c'est pas un format classique et qu'il faut aller voir webhookbody
  PingReceive("WebServiceWebhookParamsRaw" ,WebServiceWebhookParamsRaw)		;reencodage du body mais au format hmp plus facile a traiter que le json 
  WebServiceWebhookParamsRaw= Fromutf8toAnsi(left(WebServiceWebhookParamsRaw),carreste,0)

  ;exemple pour lire les paramètres de la commande service web
  Dos = hmpseek(ParamEntree,"dos",998)
  Ref = hmpseek(ParamEntree,"reference","")
  ;j'ai fait deux service webhook et dans les parametres de mon service xbal 
  ;webhook , j'ai mis <moderaw>1  dan l'un et <moderaw>0 dans l'autre 
  ;c'est juste pour voir comment on peut activer ou pas des options dans un service diva 
  ;de type webhook par exemple
   moderaw = hmpseek(WebServiceWebhookParamHMP,"moderaw","")
   
  ;on peut aussi lire les headers de la requête web d'origine
  if WebServiceWebhookHeaders <> " "
	szAuthorization = hmpseek(WebServiceWebhookHeaders,"Authorization","")
  endif
endp

procedure 	EnvoyerReponse
beginp
;exemple de retour 
	;on a fait 2 code de webhook , dans le premier on a mis le flag 1 et dans l'autre webhook 0  
	;juste pour tester les 2 types de reponses d'un webhook
	if val(moderaw) = 0
		paramsortie = stock & " éèà ParamEntree=" &left(ParamEntree) & \
			" webhookrecu=" & left(WebServiceWebhook)	& \
			" webhookcode=" & left(WebServiceWebhookCode) &		  \
			" webhookparamhmp=" & left(WebServiceWebhookParamHMP)	& \
			" webhookcom=" & left(commProvenantDuFichierXbalwebHook)	& \
			" codeappellant=" & left(cappelProvenantDuFichierXbalwebHook) & \
			" ContentType=" & left(WebServicewebhookContentType) & \		
			" cappelProvenantDuFichierXbalwebHook=" & left(WebServiceWebhookRaw) & \
			" body=" & left(WebServiceWebhookBody) & \			
			" reincodagebodyenhmp" & left(WebServiceWebhookParamsRaw) & \
		   " headers=" & left(WebServiceWebhookHeaders) 
		paramsortie  = FromAnsitoutf8(paramsortie)
		Pong("WebServiceResultContentType","")		
    	Pong("WebServiceResultHeaders","")
		CodeHttpResponse = 0 ; la valeur par defaut 0 indique que c'est le service web qui va mettre le bon code par exemple 200 si ok et  400 si erreur 
						;la liste est dans https://fr.wikipedia.org/wiki/Liste_des_codes_HTTP
	else
		paramsortie = '{ "test":"xxx","essai":"libre éàé' & left(szAuthorization) & '" }'
		paramsortie  = FromAnsitoutf8(paramsortie)
    	Pong("WebServiceResultContentType","application/json")		
		Pong("WebServiceResultUTF8","1")		  ;code en utf8 ou pas, c'est pas simple car postman reconvertie ! ce qui fait que pour postman il faudrait mettre 0 ici 
		;en hmp on peut utiliser valeur   ou bien $03 motcle $04 valeur 
		;mais faut pas mixer les deux mode , c'est soit toujours  <  > ou soit toujours $03  $04 
		;le mode $03 $04 est mieux car il permet de passer les caractères < > dans le champ valeur 
		paramsortiehh = $03 & "test_de_headers" & $04 & "10" & $03 & "code_secret_a_moi" & $04 & "simple testéè" 
		;attention IL NE DOIT PAS Y AVOIR DE BLANC DANS LE NOM D'UN HEADERS, c'est une norme web 
		paramsortiehh = left(paramsortiehh ) & $03 & "Authorization" & $04 & "Bearer ExYYyd8YsaOOT7XuZRHiULleAJsDK4StFvh6QWbbca_ro45GQtk38gkeOF14Uzv03LD4ppZoDlOjEUbEVJ/HPXc/c9kYygaCuABB2zM2c6mdpAbNgnkNE0CSX22fGvlf"
		paramsortiehh = FromAnsitoutf8(paramsortiehh)	
		Pong("WebServiceResultHeaders",left(paramsortiehh))		 
		;Pong("WebServiceResultHeadersContent",left(paramsortiehh))		 
		CodeHttpResponse = 402  ;exemple c'est juste pour test , ca renvoi le code "payment required"  voir les codes https://fr.wikipedia.org/wiki/Liste_des_codes_HTTP
	endif
	;	réponse
	Pong("WebServiceStatus",0)							;erreur ou pas du programme
	Pong("WebServiceResult",left(paramsortie))    ;la reponse
	Pong("WebServiceVersion",Vers)					;version => je sais pas a quoi ca sert mais c'est comme ca
	Pong("WebServiceResultCodeHTTP",CodeHttpResponse )		 	;code de reponse http ; 0 pour dire "prendre le code par defaut" ou nnn pour fixer un code
endp

 
exemple d'utilisation 

main
	RecupererLesParametresEnEntree
	stock = 457       ;	calcul du stock
	EnvoyerReponse
	programexit