PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → UTILISATION WEBSERVICE API REST
UTILISATION WEBSERVICE API REST
Débuté par ROMAIN, 18 avr. 2017 11:56 - 10 réponses
Membre enregistré
6 messages
Posté le 18 avril 2017 - 11:56
Bonjour à tous,

Je tourne en rond sur l'utilisation d'un Webservice mis à disposition par l'un de nos partenaires.

Vous trouverez ci-dessous un exemple d'appel à ce webservice (ce code ne fonctionne pas) :

MaReq est une restRequête
LaReponse est une restRéponse
sParametres est une chaîne

MaReq.URL = "https://app.transfertbanque.fr/releves/CFONB"
MaReq.Méthode = httpPost
MaReq..ContentType = "application/json"

sParametres = [
{
"Login": "mail_utilisateur",
"Password": "mdp_utilisateur",
"DateDebut": "01012017",
"DateFin": "31012017",
"NonTraitesSeulement": "0"
}
]

MaReq.Contenu = ChaîneVersUTF8(sParametres)

LaReponse = RESTEnvoie(MaReq)

SI ErreurDétectée ALORS

Erreur(ErreurInfo(errComplet))

SINON

Info(LaReponse..Contenu)

FIN


Je n'arrive pas à passer les 5 paramètres nécessaires à savoir :

- Login (chaine)
- Password (chaine)
- DateDebut (chaine)
- DateFin (chaine)
- NonTraitesSeulement (chaine)


Vous trouverez ci-dessous un exemple d'appel à ce webservice fonctionnel mais pas en windev :

private void Generer(string Login, string Password, string Debut, string Fin, string NonTraitesSeulement)
        {
                IRestResponse response = null;
                var client = new RestClient(System.Configuration.ConfigurationManager.AppSettings["url"].ToString() +"/CFONB");

                var request = new RestRequest(Method.POST);
                request.AddParameter("Login", Login);
                request.AddParameter("Password", Password);
                request.AddParameter("Debut", Debut); // facultatif si on veut tout ce qui est traité jusqu'à la date de fin
                request.AddParameter("Fin", Fin);
                request.AddParameter("NonTraitesSeulement", NonTraitesSeulement); // facultatif si on veut tout ce qui est traité jusqu'à la date de fin

                response = client.Execute(request);
                }


Pouvez-vous m'aider à trouver ce qui ne va pas mon code Windev ?

Merci d'avance pour votre aide !

Romain
Membre enregistré
2 574 messages
Popularité : +222 (260 votes)
Posté le 18 avril 2017 - 12:41
Bonjour,

Tu as la doc de ton WS ? Es-tu sur que tu envoies les bons paramètres ? Quelle est la réponse du WS ?

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Posté le 18 avril 2017 - 16:53
Qu'est ce qui ne marche pas?
Avec ton code, le service répond bien '200':

LaReponse <httpRéponse>
Contenu {"File":"","Error":1} X
EntêteBrut HTTP/1.1 200 OK<RC>Cache-Control: no-cache<RC>Pragma: no-cache<RC>Content-Type: application/json; charset=utf-8<RC>Expires: -1<RC>Server: Microsoft-IIS/8.5<RC>X-AspNet-Version: 4.0.30319<RC>X-Powered-By: ASP.NET<RC>Strict-Transport-Security: max-age=15552001; includeSubDomains<RC>Date: Tue, 18 Apr 2017 12:27:39 GMT<RC>Content-Length: 21<RC><RC> X
CodeEtat 200 X
DescriptionCodeEtat OK X
ContentType application/json; charset=utf-8 X

De mon coté j'utilise les variants, beaucoup plus facile à manipuler qu'un JSON construit à la main. Ce qui donnerait dans ton cas:

vCFONB est un variant
vCFONB.Login="mail_utilisateur",
vCFONB.Password="mdp_utilisateur",
vCFONB.DateDebut="01012017",
vCFONB.DateFin="31012017",
vCFONB.NonTraitesSeulement=0

MaReq.Contenu=VariantVersJSON(vCFONB)


et au retour, JSONVersVariant afin de pouvoir utiliser:

vResponse.File
vResponse.Error
...
vResponse.OtherFields
Membre enregistré
6 messages
Posté le 18 avril 2017 - 17:44
Bonjour,

Je vous remercie pour vos réponses.

Tout compte fait, mon code était correcte. C'était simplement la doc de l'API qui mentionnait les paramètres "DateDebut" et "DateFin" alors que les bon paramètres étaient "Debut" et "Fin"...

Merci Lionel pour l'utilisation des variants, c'est en effet plus simple et surtout plus clair.

Vous trouverez ci-dessous mon code :

Procedure gpGetReleveCFONB(p_sLogin est une chaîne, p_sPassword est une chaîne, p_dDebut est une Date = "", p_dFin est une Date = "", p_bNonTraitesSeulement est un booléen = Faux)

// Variables
MaRequeteRest est une restRequête
LaReponseRest est une restRéponse
vParametresRequete est un Variant
vReponse est un Variant

sCFONB est une chaîne

// Initialisation de la requête REST
MaRequeteRest.URL = "https://app.transfertbanque.fr/releves/CFONB"
MaRequeteRest.ContentType = "application/json"
MaRequeteRest.Méthode = httpPost

// Initialisation des paramètres
vParametresRequete.Login = p_sLogin
vParametresRequete.Password = p_sPassword

SI p_dDebut <> Null ALORS
vParametresRequete.Debut = DateVersChaîne(p_dDebut, "JJMMAAAA")
FIN

SI p_dFin <> Null ALORS
vParametresRequete.Fin = DateVersChaîne(p_dFin, "JJMMAAAA")
FIN

SI p_bNonTraitesSeulement ALORS
vParametresRequete.NonTraitesSeulement = "1"
SINON
vParametresRequete.NonTraitesSeulement = "0"
FIN

// Initialisation du contenu de la requête REST
MaRequeteRest.Contenu = VariantVersJSON(vParametresRequete)

// Exécution de la requête REST
LaReponseRest = RESTEnvoie(MaRequeteRest)

SI ErreurDétectée ALORS
Erreur(HErreurInfo(hErrComplet))

SINON

// Traitement de la réponse au format JSON

vReponse = JSONVersVariant(LaReponseRest.Contenu)

SELON vReponse.Error

CAS 0 // ok, fichier File en retour
sCFONB = vReponse.File

CAS 1 // Erreur d'authentification
Erreur("Erreur d'authentification")

CAS 2 // Identifiants non autorisés à utiliser le service
Erreur("Identifiants non autorisés à utiliser le service")

AUTRE CAS // Erreur non identifiée
Erreur("Erreur non identifiée")
FIN

FIN

RENVOYER sCFONB


Bon dev à vous.

Romain
Membre enregistré
20 messages
Popularité : +1 (1 vote)
Posté le 19 avril 2017 - 10:22
Bonjour à tout

J'ai la même situation que Romain mais je ne peux pas obtenir un bon résultat.
Chaque fois que j'obtiens l'erreur: 500 Internal Server Erreur

Mon code est:
maReq est un restRequête
LaReponse est un restRéponse

sReqContent est un Variant
sReqContent.cui = 5129635
sReqContent.data = "2017-03-15"

maReq.Méthode = httpPost
maReq.Contenu = VariantVersJSON(sReqContent)

maReq.ContentType = "application/json"
maReq.URL = "https://webservicesp.anaf.ro:443/PlatitorTvaRest/api/v1/ws/tva"

LaReponse = RESTEnvoie(maReq)

SI ErreurDétectée ALORS
Erreur(ErreurInfo(errComplet))
SINON
Info(LaReponse.Contenu)
FIN




Et la réponse est:




<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>
body{
margin:0px;
padding:0px;
background-color: #ffffff;
color:#000;
font-family:Arial,Verdana,Helvetica,Tahoma,sans-serif;
}
#content {
font-size: 1em;
margin-left: 1em;
margin-right: 1em;
padding: 1em;
}
h4.basichead {
font-family:Arial,Verdana,Helvetica,Tahoma,sans-serif;
}
p {
padding-top: .5em;
}
ul {
line-height: 1.3em;
}
a:link {
color: #c00000
}
a:visited {
color: #c00000
}
#page {
border: 7px;
padding: 7px
}
#box {
margin: 0;
}
#title {
font-family:Arial,Verdana,Helvetica,Tahoma,sans-serif;
font-size:24px;
font-weight: normal;
color:#274a71;
padding-bottom:6px;
}
#error {
colory: #c00004;
margin-bottom: 10px;
}
#code {
font-family: monospace;
font-size: 8pt;
}
#stack {
margin-left: 30px;
}
</style>
</head>

<body>

<div id="content">
<div id="page">
<div id="box">

<div id="error"> Exception thrown by application class 'org.apache.wink.server.internal.RequestProcessor.handleRequest:195'
</div>
<div id="code">
javax.servlet.ServletException: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.List out of START_OBJECT token
at [Source: com.ibm.ws.webcontainer.srt.SRTInputStream@6fa71721; line: 1, column: 1]<br>
<div id="stack">at org.apache.wink.server.internal.RequestProcessor.handleRequest(RequestProcessor.java:195)<br>at org.apache.wink.server.internal.servlet.RestServlet.service(RestServlet.java:124)<br>at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)<br>at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1239)<br>at [internal classes]<br>
</div>Caused by:
org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.List out of START_OBJECT token
at [Source: com.ibm.ws.webcontainer.srt.SRTInputStream@6fa71721; line: 1, column: 1]<br>
<div id="stack">at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:160)<br>at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:194)<br>at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:103)<br>at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:93)<br>at org.codehaus.jackson.map.deser.CollectionDeserializer.deserialize(CollectionDeserializer.java:25)<br>at org.codehaus.jackson.map.ObjectMapper._readValue(ObjectMapper.java:1961)<br>at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:889)<br>at org.codehaus.jackson.jaxrs.JacksonJsonProvider.readFrom(JacksonJsonProvider.java:410)<br>at org.apache.wink.providers.jackson.WinkJacksonJaxbJsonProvider.readFrom(WinkJacksonJaxbJsonProvider.java:106)<br>at org.apache.wink.server.internal.registry.ServerInjectableFactory$EntityParam.getValue(ServerInjectableFactory.java:198)<br>at org.apache.wink.common.internal.registry.InjectableFactory.instantiate(InjectableFactory.java:68)<br>at org.apache.wink.server.internal.handlers.CreateInvocationParametersHandler.handleRequest(CreateInvocationParametersHandler.java:44)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)<br>at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)<br>at org.apache.wink.server.handlers.AbstractHandler.handleRequest(AbstractHandler.java:34)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)<br>at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)<br>at org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleResourceMethod(FindResourceMethodHandler.java:151)<br>at org.apache.wink.server.internal.handlers.FindResourceMethodHandler.handleRequest(FindResourceMethodHandler.java:65)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)<br>at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)<br>at org.apache.wink.server.internal.handlers.FindRootResourceHandler.handleRequest(FindRootResourceHandler.java:95)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)<br>at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)<br>at org.apache.wink.server.internal.handlers.HeadMethodHandler.handleRequest(HeadMethodHandler.java:53)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)<br>at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)<br>at org.apache.wink.server.internal.handlers.OptionsMethodWADLHandler.handleRequest(OptionsMethodWADLHandler.java:51)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)<br>at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)<br>at org.apache.wink.server.internal.handlers.SearchResultHandler.handleRequest(SearchResultHandler.java:33)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)<br>at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)<br>at org.apache.wink.server.internal.log.ResourceInvocation.handleRequest(ResourceInvocation.java:92)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)<br>at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)<br>at org.apache.wink.server.internal.log.Requests.handleRequest(Requests.java:76)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:26)<br>at org.apache.wink.server.handlers.RequestHandlersChain.handle(RequestHandlersChain.java:22)<br>at org.apache.wink.server.handlers.AbstractHandlersChain.doChain(AbstractHandlersChain.java:75)<br>at org.apache.wink.server.handlers.AbstractHandlersChain.run(AbstractHandlersChain.java:60)<br>at org.apache.wink.server.internal.RequestProcessor.handleRequestWithoutFaultBarrier(RequestProcessor.java:207)<br>at org.apache.wink.server.internal.RequestProcessor.handleRequest(RequestProcessor.java:154)<br>... 4 more<br>
</div>
</div>
</div> </div>
</div>
</div>

</body>


Avez-vous une suggestion?

Je vous remercie

--
Issa Bej
Membre enregistré
2 574 messages
Popularité : +222 (260 votes)
Posté le 19 avril 2017 - 11:33
Bonjour,

Que contient ta variable avant envoi ? Toutes les données sont-elles remplies ? Ton json est-il correct avant envoi ?

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Membre enregistré
3 messages
Posté le 19 avril 2017 - 12:23
Bonjour à tous !
Je suis un gros débutant sous WB / WD
j'essaie d'établir un WS mais j'ai du mal à correctement récupérer les valeurs
pouvez vous m'aider svp
J'ai ouvert un post ici: https://forum.pcsoft.fr/fr-FR/pcsoft.fr.webdev.old/3282-creer-consommer-webservice/read.awp…

--
Tous sur => http://rabbytech.com
New In Win/Webdev Mobile
Soif d'apprendre.
Membre enregistré
20 messages
Popularité : +1 (1 vote)
Posté le 19 avril 2017 - 13:33
Bonjour Philippe,
Leurs spécifications sont très simplistes

Send request containing the data processed at the following address:
Web Service URL (POST) :  https://webservicesp.anaf.ro:/PlatitorTvaRest/api/v1/ws/tva
             The request must be sent POST and the format is similar to the example below:
Post Body:
[
{
     "cui": _Numar_, "data":"_Data interogarii_"     
},
{
     "cui": _Numar_, "data":"_Data interogarii_"     
}
]

example:

Content-Type: application/json
            [
                {
                    "cui": 1234,
                    "data": "2015-02-14"
                },
                {
                    "cui": 5678,
                    "data": "2015-02-14"
                }
            ]


Merci beaucoup,

--
Issa Bej
Posté le 19 avril 2017 - 14:35
Bonour Issa,

L'API attend un tableau, donc dans ton cas:

vReqContent est un Variant
vReqContent[1].cui = 5129635
vReqContent[1].data = "2017-03-15"


et tu peux le cas échéant créer d'autre itération comme dans l'exemple fourni:

vReqContent[2].cui = nValue2
vReqContent[2].data = sValue2
vReqContent[3].cui = nValue3
vReqContent[3].data = sValue3
etc...
Membre enregistré
20 messages
Popularité : +1 (1 vote)
Posté le 19 avril 2017 - 15:33
Merci Lionel

Il ne fonctionne toujours pas
Le code d'erreur est 415 et la description de l'erreur est "Unsupported Media Type" même si le contenu semble être correct
maReq.Contenu = [ { "cui":5129635, "data":"2017-03-15" }, { "cui":11307036, "data":"2017-03-15" } ]
OU
maReq.Contenu = [ { "cui":5129635, "data":"2017-03-15" } ]


--
Issa Bej
Posté le 07 décembre 2019 - 10:32
Bonjour, si quelqu’un a une connaissance à propos api rest merci de
Me répond sur cette question
https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windevmobile/37912-passer-session-dans-requete/read.awp