IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web & réseau Delphi Discussion :

Delphi REST Request - Requête POST Multipart/Form-Data


Sujet :

Web & réseau Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Par défaut Delphi REST Request - Requête POST Multipart/Form-Data
    Bonjour à tous,
    Désolé si je suis peut-être un peu maladroit, il s'agit de ma première intervention ici même si j'ai pourtant lu et appris de temps à autre sur ce site et je profite de remercier ceux qui prennent le temps d'en alimenter les contenus.

    Je me permets de poser une question peut-être banale s'agissant de requête REST Post mais n'étant pas très familiarisé dans ce domaine, j'avoue que j'y perds mon latin.... En effet, il y a un peu partout des infos sur la commande Get mais il est beaucoup plus difficile de trouvers des infos sur Post surtout s'agissant de Multipart/Form-Data.
    Voici l'exemple que je tente de réaliser et je précise que cette requête fonctionne parfaitement avec Postman.
    Par contre si tente de la recréer avec RestDebugger (Delphi XE7), j'essuie systématiquement une erreur 400 ! et même scénario avec les composants RESTClient, RESTRequest, RESTResponse...
    Le mystère reste entier en ce qui concerne la manière et où définir la Boundary...
    Et j'ai tenté ou de joindre le fichier tel que c'est possible dans Postman ou de l'envoyer en code XML, les résultats sont les mêmes...
    J'ai "torturé" tout cela dans passablement de sens, peut-être pas tous je l'avoue mais cependant rien à faire, je finis toujours avec une erreur 400 ! :

    Donc si une ou plusieurs personnes ont déjà rencontré ce genre de problème, ce qui me semble être le cas ayant visité pas mal de sites sur le sujet
    et une ou plusieurs solutions existent, je vous remercie infiniment pour votre aide

    Voici donc: (Les données sont bien évidemment fictives
    ------------------------------------------------------------------------------------------------------------------------------------------
    https://123.456.7.890:8080/ab/cde/fghi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    POST /ab/cde/fghi HTTP/1.1
    Host: 123.456.7.890:8080
    IDCLI: 123456789
    Content-Type: multipart/form-data; boundary=--Boundary7MA4Y
    Authorization: Krpaf123456789abD
    Content-Length: 441
     
    --Boundary7MA4Y
    Content-Disposition: form-data; name="mystream"; filename="/D:/REST/file123456.xml"
    Content-Type: text/xml
     
    (data)
    --Boundary7MA4Y
    Content-Disposition: form-data; name="myinfo"
    Content-Type: application/json
     
    {
    "printLanguage" : "fr"
    }
    --Boundary7MA4Y

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 607
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    c'est vrai que j'ai rarement vu d'information sur la partie POST de REST, ce qui me fait penser qu'il faudrait que je lise le chapitre 16 du livre de Thierry Grassia.

    perso je me suis dépatouillé de cet exercice en utilisant (modification de données dans une base Prestashop)
    Nom : Capture.PNG
Affichages : 240
Taille : 11,4 Ko
    Utilisé dans un programme "one shot" pas très propre cela écrit il a fonctionné

  3. #3
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Bonjour

    Les paramètres reçus en multipart ne sont pas décodés automatiquement par Delphi, c'est à nous de le faire et la dernière fois que j'avais regardé, ce n'était pas documenté.

    Il faut faire le travail nous-même en utilisant l'unité Web.ReqMulti côté serveur (si WebBroker) et pour l'envoi c'est beaucoup plus simple à la main. Je n'ai jamais tenté avec les composants REST ou le REST Debugguer.

    Tu trouveras un exemple d'envoi de fichier et sa récupération dans le projet https://github.com/DeveloppeurPascal...er/04-Internet

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    plus je fais du REST plus je suis dépité par ce que je vois...voici un exemple ou il faut envoyer deux documents au serveur, l'un en XML l'autre en JSON...c'est juste n'importe quoi

    ça me rappelle ce serveur qui demandait d'utiliser XOP (ça permet de mettre des pièces jointes binaires à une requête SOAP XML, ce qui évite d'avoir les données binaires en CDATA base64 dans le XML) sauf que le serveur réclamait des pièces jointes en XML donc si c'était un PDF il était dans en base64 dans le CDATA du XML en pièce jointe
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 607
    Billets dans le blog
    65
    Par défaut
    Je suis d'accord. Je suis sûr que c'est une méconnaissance de ma part plutôt que REST. Cette méconnaissance, due en grande partie au manque de documentation : tout sur le GET rien ou presque sur le POST

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Par défaut Delphi REST Request - Requête POST Multipart/Form-Data
    Bonjour et merci à tous pour vos réactions, je pensais être seul à avoir cette méconnaissance mais je m'aperçois que ce n'est pas le cas.
    Au fil de mes investigations, je test actuellement Securbridge de Devart qui me parait intéressant et qui semble-t-il pose moins de problèmes que les composants Embarcadero. J'ai posé la question et voici la réponse et proposition de code qui m'a été transmise ci-dessous.
    Je suis en train de disséquer tout cela et pour l'instant j'ai une erreur qui m'indique "Unsuppored Media Type"...
    A en croire les directives, manquerait-il Content-Type: application/octet-stream et Content-Transfer-Encoding: binary ?
    J'ai donc essayé d'insérer cela avant "Content-Disposition: form-data; name="mystream" mais là, je reçois une message "Bad request...."

    Pour répondre à Paul, le contenu en JSON est facultatif, je l'ai ajouté parce qu'il fait partie des indications mais il est vrai que le contenu important est bien sûr le fichier xml, de plus à voir, ce n'est pas ce contenu qui pose problème...

    A suivre donc....

    Très bel après-midi à tous, encore merci pour vos suggestions et meilleures salutations



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    procedure TForm1.Button2Click(Sender: TObject);
    var
      Request: TScHttpWebRequest;
      Response: TScHttpWebResponse;
      ResponseStr, JSONStr, BoundryStr: string;
      Buf: TBytes;
      ms: TStream;
      fs: TFileStream;
    begin
      ms := TMemoryStream.Create;
      Request := TScHttpWebRequest.Create('https://some.request.uri'); //<-void URI for reference
      BoundryStr := '---------------------------42708293323423383188946176979';//random charaster sequence, NEVER appeared in content data
      try
        //encoding XML
        Buf := Encoding.Default.GetBytes('--' + BoundryStr + #13#10);
        ms.Write(Buf, 0, Length(Buf));
     
    //Content-Type: application/octet-stream
     //Buf := TEncoding.Default.GetBytes('Content-Type: application/octet-stream'#13#10#13#10);
     //ms.Write(Buf, 0, Length(Buf));
     //Content-Transfer-Encoding: binary
     //Buf := TEncoding.Default.GetBytes('Content-Transfer-Encoding: binary'#13#10#13#10);
     //ms.Write(Buf, 0, Length(Buf));    [/COLOR]
     
        Buf := Encoding.Default.GetBytes('Content-Disposition: form-data; name="mystream"; filename="/D:/REST/file123456.xml"'#13#10);
        ms.Write(Buf, 0, Length(Buf));
        Buf := Encoding.Default.GetBytes('Content-Type:  text/xml'#13#10#13#10);
        ms.Write(Buf, 0, Length(Buf));
        fs := TFileStream.Create('D:\REST\file123456.xml', fmOpenRead or fmShareDenyWrite);
        ms.CopyFrom(fs);
        fs.Free;
        // encoding JSON
        Buf := Encoding.Default.GetBytes(#13#10'--' + BoundryStr + #13#10);
        ms.Write(Buf, 0, Length(Buf));
        Buf := Encoding.Default.GetBytes('Content-Disposition: form-data; name="myinfo"'#13#10);
        ms.Write(Buf, 0, Length(Buf));
        Buf := Encoding.Default.GetBytes('Content-Type: application/json'#13#10#13#10);
        ms.Write(Buf, 0, Length(Buf));
        Buf := Encoding.Default.GetBytes('{'+#13#10+'"printLanguage" : "fr"'+#13#10+'}');
        ms.Write(Buf, 0, Length(Buf));
        //end of multipart content
        Buf := Encoding.Default.GetBytes(#13#10'--' + BoundryStr + '--'#13#10);
        ms.Write(Buf, 0, Length(Buf));
        ms.Position := 0;
        //setup request
        Request.RequestStream := ms;
        Request.Headers.Add('Authorization', 'Krpaf123456789abD');
        Request.Headers.Add('IDCLI', '123456789');
        Request.ContentType := 'multipart/form-data; boundary=' + BoundryStr;
        try
          //Obtaining response
          Response := Request.GetResponse;
          ResponseStr := Response.readAsString;
        finally
          Response.Free;
        end;
      finally
        ms.free;
        Request.Free;
      end;
    end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Serialize POST multipart/form-data
    Par seb-65 dans le forum jQuery
    Réponses: 2
    Dernier message: 06/08/2012, 10h47
  2. Soucis avec un POST enctype="multipart/form-data"
    Par Goupo dans le forum Langage
    Réponses: 2
    Dernier message: 17/04/2009, 17h21
  3. Réponses: 2
    Dernier message: 04/11/2008, 15h04
  4. [Flash] Post avec LoadVars en multipart/form-data
    Par ViveLesQuads dans le forum Flash
    Réponses: 6
    Dernier message: 16/01/2007, 17h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo