PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → HTTPREQUETE
HTTPREQUETE
Iniciado por SEB14, abr., 15 2024 10:40 AM - 6 respostas
Membro registado
3 mensagems
Publicado em abril, 15 2024 - 10:40 AM
Bonjour à tous,

Je commence à utiliser les API d'un site externe. Sur une plateforme, je suis chargé de créer un dossier pour lequel il m'est demandé de spécifier le nom du dossier en paramètre ; jusqu'ici, rien qui sorte de l'ordinaire ni de particulièrement alarmant.
Les requêtes doivent être transmises via HTTPS et toute donnée envoyée doit être formatée en JSON (type de contenu : application/json). Chaque requête doit également inclure des en-têtes spécifiques, notamment « Content-Type: application/json » et « API-Key » suivi de la clé d’API correspondante.

Voici les informations que me donne le site :
curl --request POST \
--url https://************/v3/contacts/folders \
--header 'accept: application/json' \
--header 'api-key: maclefsxxxxxxxxxxxxxxxxxxxxx' \
--header 'content-type: application/json' \
--data '
{
"name": "Test de dossier"
}
'
Voici mon code :
Procedure Maprocedure(maclefs est une chaîne, sCustomerName est une chaîne)
req2 est une httpRequête
sMarequette2 est une chaîne
sheader est une chaîne
sheader = "Content-Type: application/json" + RC +"accept: application/json" + RC + "api-key: " + maclefs
scontenu est une chaîne
scontenu = "{""name" + """:" + """" + sCustomerName+ """" + "}"
req2..Méthode = httpPost
req2.Entête["header"] = sheader
req2.Contenu = scontenu
sMarequette2 = "https://************/v3/contacts/folders "
req2.URL = sMarequette2
cMaRéponse2 est un httpRéponse = HTTPEnvoie(req2)
Lejson2 est un JSON
Lejson2 = cMaRéponse2..Contenu



Je transmets le nom de mon dossier via le paramètre sCustomerName et ma clé via le paramètre de la procédure. Cependant, je rencontre systématiquement une erreur 400.
{
"code":"invalid_parameter",
"message":"Folder name is invalid"
}

Je tiens à préciser que la clé est correcte et fonctionne bien, puisque toutes mes requêtes HTTP en GET sont correctement traitées.

Je comprends bien que mes paramètres ne sont pas transmis correctement. Cependant, je dois avouer que je suis à court d'idées.
J'ai essayé de substituer la chaîne par du JSON dans le contenu, et j'ai également testé avec un buffer, mais rien ne semble fonctionner.
J'ai aussi vérifié les valeurs de req2 et de scontenu lors du débogage.
Je vous remercie par avance pour le temps que vous consacrerez à ma problématique.
Cordialement,
Sébastien
Membro registado
3.908 mensagems
Popularité : +227 (347 votes)
Publicado em abril, 15 2024 - 11:08 AM
Bonjour,
Tout est expliqué dans la doc :
Le propriété Entête est un tableau associatif dont la clé correspond au "titre" des différentes parties de l'entête e.g. content-type.
Il faut donc écrite ;
oMaRequete.Entête["Content-Type] = "application/JSON"
//etc


--
Il y a peut être plus simple, mais, ça tourne
Quand tout a échoué utilise l'option RTFM
Mensagem modificada, abril, 15 2024 - 11:10 AM
Membro registado
3 mensagems
Publicado em abril, 15 2024 - 11:28 AM
Bonjour
Je ne pense pas avoir de problème avec l'entête
Mon code n'est certainement pas optimal mais cette procédure fonctionne très bien pour récupérer les contacts déjà existant d'un dossier

MAPROCEDURE2 (maclefs est une chaîne)
req2 est une httpRequête
sMarequette2 est une chaîne
Données est un Variant
sheader est une chaîne
sheader = "Content-Type: application/json" + RC + "api-key: " + maclefs
req2..Méthode = httpGet
req2.Entête["header"] = sheader
sMarequette2 = "https://***********/v3/contacts?limit=50&offset=0&sort=desc"
req2.URL = sMarequette2
cMaRéponse2 est un httpRéponse = HTTPEnvoie(req2)
Lejson2 est un JSON
Lejson2 = cMaRéponse2..Contenu


Je reçois bien ces contact dans le json sans problème. Ici c'est de passer dans ma requette post le nom du dossier, je ne sais pas le faire
A moins que je ne vous ai pas compris dans votre explication, j'en suis désolé.
Sébastien.
Membro registado
3.908 mensagems
Popularité : +227 (347 votes)
Publicado em abril, 15 2024 - 12:08 PM
Dans le curl, on voit que la partie data est un JSON.
Il faut donc écrire :
oDonnées est un JSON

//...
oDonnées.name = "Test de dossier"
//...
oMaRequête.contenu=oDonnées


--
Il y a peut être plus simple, mais, ça tourne
Membro registado
398 mensagems
Popularité : +13 (13 votes)
Publicado em abril, 15 2024 - 12:24 PM
Bonjour,

Vous pouvez utiliser un type JSON aussi pour spécifier le contenu, cela sera plus simple que de le construire par une chaîne (où vous n'échappez pas les guillemets, d'ailleurs).

Et je rejoins Voroltinquo, si req2.Entête["header"] fonctionne (ça paraît surprenant mais pourquoi pas), ce serait plus propre et plus maintenable que chaque en-tête ait sa propre ligne.

Procedure Maprocedure(maclefs est une chaîne, sCustomerName est une chaîne)

req est une httpRequête
req.URL = "https://************/v3/contacts/folders"
req.Methode = httpPost

req.ContentType = typeMimeJSON
req.Entête["Accept"] = typeMimeJSON
req.Entête["api-key"] = maclefs

jContenu est un JSON
jContenu.name = sCustomerName

req.Contenu = jContenu

res est un httpRéponse = req.Envoie()
jRéponse est un JSON

SI JSONValide(res..contenu) ALORS
jRéponse = res..Contenu
FIN

Trace(jRéponse)


Edit : Voroltinquo m'a battu :)
Mensagem modificada, abril, 15 2024 - 12:25 PM
Membro registado
3.908 mensagems
Popularité : +227 (347 votes)
Publicado em abril, 15 2024 - 1:04 PM
bchanudet a écrit :
Edit : Voroltinquo m'a battu

Concernant le type JSON je suppose.

--
Il y a peut être plus simple, mais, ça tourne
Membro registado
3 mensagems
Publicado em abril, 15 2024 - 1:29 PM
Bonjour
Super je vous remercie sincèrement cela fonctionne. :)
Je me suis donc noté des choses à éclaircir pour moi.
Belle journée à vous deux.
Seb