PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → Envoyer un fichier avec API Rest
Envoyer un fichier avec API Rest
Iniciado por Karine Houbrix, ago., 06 2020 5:10 PM - 12 respostas
Publicado em agosto, 06 2020 - 5:10 PM
Bonjour à tous,
Ca fait des heures que je suis sur ce problème et je ne trouve aucune solution.
J'utilise l'api Rest pour discuter avec Jira (Atlassian) et j'aimerais joindre un fichier sur une "issue"
Voilà leur doc :
curl -D- -u admin:admin -X POST -H "X-Atlassian-Token: no-check" -F "file=@myfile.txt" https://your-domain.atlassian.net/rest/api/2/issue/TEST-123/attachments


Voilà mon code actuellement (où il manque la partie d'envoi de fichier du coup) :
MaReq.URL = "https://karinehoubrix.atlassian.net/rest/api/2/issue/SYN-46/attachments"
MaReq.Header["Authorization"] = "Basic aG91YnJpeC5rYXJpbmVAZ21haWwuY29tOkRyaVl2UWRBZDlHR2RzYTRlZ2Q2MEMwNg=="
MaReq.Header["Accept"] = "application\json"
MaReq.Header["X-Atlassian-Token"] = "no-check"
MaReq.ContentType = "multipart/form-data; boundary= simple boundary"
MaReq.Method = httpPost


Reponse = RESTSend(MaReq)

IF ErrorOccurred THEN
Error(ErrorInfo(errFullDetails))
ELSE
Info(Reponse.CodeEtat)
END


Et pour finir, j'ai testé ma requête sur Postman qui fonctionne sans soucis et en récupérant le code, je vois qu'il faudrait que j'implémente cette ligne en Windev :
Content-Disposition: form-data; name="file"; filename="/C:/Users/karine.houbrix/Pictures/test.png"


Ce qui donne ce résultat en JSON :
{
        "self": "https://karinehoubrix.atlassian.net/rest/api/2/attachment/10003",
        "id": "10003",
        "filename": "test.png",
        "author": {
            "self": "https://karinehoubrix.atlassian.net/rest/api/2/user?accountId=5aa6b07d4712c13220b775a7",
            "accountId": "5aa6b07d4712c13220b775a7",
            "emailAddress": "houbrix.karine@gmail.com",
            "avatarUrls": {
                "48x48": "https://secure.gravatar.com/avatar/e647b953c8ca119c52d033ce5cd6fbdd?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKH-4.png",
                "24x24": "https://secure.gravatar.com/avatar/e647b953c8ca119c52d033ce5cd6fbdd?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKH-4.png",
                "16x16": "https://secure.gravatar.com/avatar/e647b953c8ca119c52d033ce5cd6fbdd?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKH-4.png",
                "32x32": "https://secure.gravatar.com/avatar/e647b953c8ca119c52d033ce5cd6fbdd?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Finitials%2FKH-4.png"
            },
            "displayName": "Karine Houbrix",
            "active": true,
            "timeZone": "Europe/Brussels",
            "accountType": "atlassian"
        },
        "created": "2020-08-06T16:47:19.927+0200",
        "size": 234148,
        "mimeType": "image/png",
        "content": "https://karinehoubrix.atlassian.net/secure/attachment/10003/test.png",
        "thumbnail": "https://karinehoubrix.atlassian.net/secure/thumbnail/10003/test.png"
    }


Donc quel est la commande en WinDev pour arriver au même résultat ? Merci !
Membro registado
5 mensagems
Publicado em agosto, 07 2020 - 9:30 AM
Up
Membro registado
160 mensagems
Popularité : +18 (22 votes)
Publicado em agosto, 07 2020 - 10:42 AM
bufFichier est un Buffer


bufFichier=fChargeBuffer("Chemin de ton fichier ")
MaReq.Contenu=bufFichier
Membro registado
5 mensagems
Publicado em agosto, 10 2020 - 10:44 AM
Merci beaucoup pour ta réponse mais j'ai une erreur 400 en faisant ça... Tu sais à quoi c'est dû ?
Membro registado
160 mensagems
Popularité : +18 (22 votes)
Publicado em agosto, 10 2020 - 11:11 AM
essaye ça
MaReq.ContentType= "application/x-www-form-urlencoded".
Membro registado
123 mensagems
Popularité : +7 (9 votes)
Publicado em agosto, 10 2020 - 11:14 AM
Hi Karine,

I guess you need to add this to the http request header.
so:
MaReq.Header["Content-Disposition"]=form-Data; name="file"; filename="C:/Users/karine.houbrix/Pictures/test.png"


My 2 cents ;-)

--
Peter Holemans
www.mcs2.eu
www.pixontri.eu
Membro registado
5 mensagems
Publicado em agosto, 10 2020 - 2:04 PM
freak per a écrit :
essaye ça
MaReq.ContentType= "application/x-www-form-urlencoded".


Toujours une erreur 400...

Peter Holemans (BE) a écrit :
Hi Karine,

I guess you need to add this to the http request header.
so:
MaReq.Header["Content-Disposition"]=form-data; name="file"; filename="C:/Users/karine.houbrix/Pictures/test.png"


My 2 cents

--
Peter Holemans
www.mcs2.eu
www.pixontri.eu


Always try but always the same response "Error 400" ... :(
Membro registado
123 mensagems
Popularité : +7 (9 votes)
Publicado em agosto, 10 2020 - 2:44 PM
Bonjour,

HTTP réponse 400 = Bad Request
Donc plusieurs options:
- Formattage du request (HTTP Header / Ou contenu json p.e. un numérique n'a pas de quotes, ...)

Si la même demande json fonctionne par PostMan il faut regarder peut-être l'authentification.
Quelle est l'authentification que tu as utilisé avec PostMan? Aussi "Basic" comme dans ton exemple? Est-ce que l'encodage dans PostMan en Base64 est identique à l'encodage par WX quand tu vérifie la demande http envoyé à Jira? Souvent en mode Unicode il faut passer la chaine username:password transformé en ANSI d'abord dans l'encodage vers Base64.

Fais une comparaison dans notepad++ de la demande json et de la partie http entre PostMan et WX.

--
Peter Holemans
www.mcs2.eu
www.pixontri.eu
Membro registado
5 mensagems
Publicado em agosto, 10 2020 - 3:20 PM
Peter Holemans (BE) a écrit :
Bonjour,

HTTP réponse 400 = Bad Request
Donc plusieurs options:
- Formattage du request (HTTP Header / Ou contenu json p.e. un numérique n'a pas de quotes, ...)

Si la même demande json fonctionne par PostMan il faut regarder peut-être l'authentification.
Quelle est l'authentification que tu as utilisé avec PostMan? Aussi "Basic" comme dans ton exemple? Est-ce que l'encodage dans PostMan en Base64 est identique à l'encodage par WX quand tu vérifie la demande http envoyé à Jira? Souvent en mode Unicode il faut passer la chaine username:password transformé en ANSI d'abord dans l'encodage vers Base64.

Fais une comparaison dans notepad++ de la demande json et de la partie http entre PostMan et WX.

--
Peter Holemans
www.mcs2.eu
www.pixontri.eu


Je fais exactement la même chose dans PostMan et WinDev. D'ailleurs ce n'est pas ma première requête et les autres fonctionnent sans problème. Je ne peux même pas comparé les Json car ma réponse est complètement vide. Je n'ai d'ailleurs aucune description sur le problème juste "error 400" (J'ai même pas le Bad Request alors que si je fais une faute de frappe, je l'ai bien). Je crois que je vais passer par une requête HTTP et non Rest pour cette partie
Membro registado
123 mensagems
Popularité : +7 (9 votes)
Publicado em agosto, 10 2020 - 6:45 PM
MiniChupa a écrit :

Je fais exactement la même chose dans PostMan et WinDev. D'ailleurs ce n'est pas ma première requête et les autres fonctionnent sans problème. Je ne peux même pas comparé les Json car ma réponse est complètement vide. Je n'ai d'ailleurs aucune description sur le problème juste "error 400" (J'ai même pas le Bad Request alors que si je fais une faute de frappe, je l'ai bien). Je crois que je vais passer par une requête HTTP et non Rest pour cette partie


Rebonjour,
Techniquement une requête REST est une simple requête HTTP (GET, POST, PUT, DELETE, ...) selon le mechanisme REST (REpresentational State Transition). Et quand je mentionne qu'il faut comparer les requêtes json entre PostMan et WX, je veux dire les contenus json à l'envoi, pas dans le retour.

Retour 400 est simplement le code de retour de la requête HTTP comme défini dans le protocole HTTP: https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
Ici cela veut dire (note que normalement il doit être un explication en retour donc je crois qu'il y a un problème au niveau de l'entête http):

4xx Client errors
This class of status code is intended for situations in which the error seems to have been caused by the client. Except when responding to a HEAD request, the server should include an entity containing an explanation of the error situation, and whether it is a temporary or permanent condition. These status codes are applicable to any request method. User agents should display any included entity to the user.[30]
400 Bad Request
The server cannot or will not process the request due to an apparent client error (e.g., malformed request syntax, size too large, invalid request message framing, or deceptive request routing).


Pour y revenir, il y a un problème avec ta requête http (utilisant la méthodologie REST). Et si cela fonctionne dans PostMan, il faut donc analyser la différence à l'envoi (si le retour dans le body ne précise pas plus de détails). Il faut donc comparer le message HTTP (entête inclus) et le contenu (json) envoyé entre PostMan et WX.

Bonne chance !

--
Peter Holemans
www.mcs2.eu
www.pixontri.eu
Publicado em agosto, 12 2020 - 3:13 PM
Bonjour,
Et pourquoi ne pas utiliser curl.exe directement? (inclus dans Windows).
Membro registado
123 mensagems
Popularité : +7 (9 votes)
Publicado em maio, 04 2021 - 6:10 PM
Hello Karine

As-tu pu résoudre ton challenge finalement?
Toujours intéressé à ce qui provoquait le souci.

--
Peter Holemans
www.mcs2.eu
www.pixontri.eu
Membro registado
123 mensagems
Popularité : +7 (9 votes)
Publicado em maio, 05 2021 - 9:37 AM
Hello Karine

Après réflexion... J'avais une demande pareille il y a qq mois.
Il faut utiliser le httpSendForm ce qui fonctionne pour ce que tu essaies de faire (envoyer des fichiers par REST).
Ici un exemple pour envoyer deux fichiers par une requête REST...

...
//Declare variables
RESTRqst is restRequest
RESTResp is restResponse
MimeType is string
FormName is string = GetGUID(guidRough)
JSONFile is string = TMPFileDir+[fSep]+FormName+".json"
...
//Create the form to send the files
HTTPCreateForm(FormName)
HTTPAddFile(FormName,"file",pFileName,MimeType)
HTTPAddFile(FormName,"moAdd",JSONFile,typeMimeJSON)
...
//Set REST Request Parameters and fill form fields
RESTRqst..UserAgent = "Pixontri JDEdwards REST"
//The content is sent as form-data
RESTRqst..ContentType = typeMimeMultiPartForm //-->multipart/form-data
//RESTRqst..Content = "" //-->no content -> form
RESTRqst..Method = httpPost
RESTRqst..URL = JDEEndPointURL+["/"]+pServiceURL
RESTRqst..User = pUserName
RESTRqst..Password = pUserPassword
...
//Execute REST request
RESTResp = HTTPSendForm(FormName,RESTRqst) //RestSend(RESTRqst)

//Server was reachable?
IF NOT ErrorOccurred THEN
...


--
Peter Holemans
www.mcs2.eu
www.pixontri.eu