api call mit multipart/form-data

Hallo, ich muß, einen POST Call absetzen. Leider ist das Zielsystem nicht in der Lage, reinen JSON-Code zu verarbeiten. Hier ist er mal:


{

"referenceWebshop": "37926",

"referenceCustomer": "1026",

"companyname": "0",

"firstname": "xxx",

"lastname": "yyy",

"street": "zzz",

"housenumber": "32",

"postalcode": "66666",

"city": "Straubing",

"country": "DE",

"phone": "0",

"email": "test@apitest.de",

"remark": "0",

"orderlines": [

{

"productcode": "JDG5Mix",

"quantity": "1",

"text": "Kim Extra Large Mix"

},

{

"productcode": "JDG5Mix",

"quantity": "1",

"text": "Kim Extra Large Mix"

}

]

}


Ich muß das Ganze im Content-Type "multipart/form-data" erstellen. Nach langem Probieren, Recherchieren usw. weiß ich es Folgendes: Im Tool "Postman" und anderen klappt es folgendermaßen: Ich muß ein Key-Value-Paar eingeben. Der Key heißt "body" und der Value ist die komplette JSON-Struktur. Damit klappt das. Aber wie gebe ich das denn im Synesty-Step ApiCall ein? Wenn ich mir nach erfolgtem Call in einem der Tools den Request ansehe, wurde das daraus gemacht:

Erster Teil:

image


Zweiter Teil:

----------------------------026658235136403660471301

Content-Disposition: form-data; name="body"

{ "referenceWebshop": "37926", "referenceCustomer": "1026", "companyname": "0", "firstname": "xxx", "lastname": "yyy", "street": "zzz", "housenumber": "32", "postalcode": "66666", "city": "Straubing", "country": "DE", "phone": "0", "email": "test@apitest.de", "remark": "0", "orderlines": [ { "productcode": "JDG5Mix", "quantity": "1", "text": "Kim Extra Large Mix" }, { "productcode": "JDG5Mix", "quantity": "1", "text": "Kim Extra Large Mix" } ] }


Leider hat bisher nichts geklappt, ich bekomme jedes Mal "Invalid JSON Code" als Antwort. Bin am Verzweifeln...


Gruß Micha

Hi Micha,


ein multipart/form-data Request wird bei uns nur erstellt, wenn eine Datei (fileToUpload) im URLDownload/SpreadsheetUrlDownload/APICall verwendet wird. Du kannst folgendes probieren:


  1. Erstelle eine Datei mit dem JSON Inhalt (TextHtmlWriter + StringToFile, siehe Screenshot 1)
  2. Den Output vom StringToFile verwendest du als fileToUpload Input im URLDownload (Screenshot 2)
  3. Darunter findest du fileParameterName. Hier kannst du body angeben (Screenshot 2)
  4. method kannst du auf POST setzten und die Parameter deiner URL in den requestBody einfügen (Screenshot 3)


Screenshot 1:

Screenshot 2:

Screenshot 3:


Ergebnis:



VG Torsten

Zunächst einmal danke für die schnelle Antwort. Klappt bei mir leider nicht, nicht einmal, wenn ich das Ganze so nachstelle wie Du geschrieben hast, also versuche, die ganze Sache an restbin zu schicken. Ich erhalte einen Fehler 400 (NOT FOUND). Hast Du sonst noch was in den Steps anders eingestellt als Standard? Da sind ja noch viele Felder, vielleicht hast Du da ja auch Username/Passwort eingetragen? Dann kann ich es ja sowieso vergessen, das soweit erstmal nachzustellen.


Gruß Micha

Fehler ist natürlich 404

Es ist echt zum Mäuse melken. Abgesehen von de, was ich oben schrieb und wo ich noch auf eine Antwort hoffe, ist mein eigentliches Ziel ja natürlich, den Call an die relevante API abzusetzen. Es klappt einfach nicht. Wenn ich nach Deiner Anleitung am Ende den URLDownload-Step habe, bekomme ich die Antwort "Bad Request". Nehme ich stattdessen den ApiCall-Step, bekomme ich "Invalid JSON Syntax". Ich habe das Ganze nochmals mit Postman überprüft, da läuft der Call mit dem key-value-Paar (also "body" und dem ganzen JSON-String) ohne Probleme durch. Wie kann ich denn genau sehen, welchen Code Synesty an die API schickt? Im Postman sieht es ja letztlich so aus (Anm. Ich habe in dem JSON alles was ein Wert ist mittlerweile ohne Anführungszeichen gesetzt, wegen dieses "Invalid JSON Syntax"-Fehlers - nützt auch nix):


POST /v1/orders/create?apitoken=test_022af9488a821c297dc92ca7650adcbb42526da5& type=json HTTP/1.1

Host: api.floraathome.nl

cache-control: no-cache

Postman-Token: 2ddd5eb3-4bb6-4aea-96e4-eb27eb3ddcbb

Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW


Content-Disposition: form-data; name="body"


{ "referenceWebshop":37926,"referenceCustomer":1026,"companyname":"none","firstname":"xxx","lastname":"yyy","street":"zzz","housenumber":32,"postalcode":66666,"city":"Straubing","country":"DE","phone":"none","email":"test@apitest.de","remark":"none","orderlines":[ { "productcode":"JDG5Mix","quantity":1,"text":"Kim Extra Large Mix" },{ "productcode":"JDG5Mix","quantity":1,"text":"Kim Extra Large Mix" } ] }

------WebKitFormBoundary7MA4YWxkTrZu0gW--

Du kannst versuchen den Debug Modus im Flow zu aktivieren. Dann den Flow echt ausführen (keine Step-Vorschau) und dann im Event-Log das HTTP-Log herunterladen. Da siehst du was übertragen wird.
Wegen RequestBin 404 Errors: Hast du dir dort wirklich eine eigene Request-Bin URL erzeugen lassen and die du schickst? Bitte nicht das aus dem Screenshot rauskopieren. RequestBin (und ähnliche Tools) löschen die URLs auch nach kurzer Zeit wieder. Das würde 404 erklären.

Hmm, hat nicht geklappt, ich sehe keine Schaltfläche für das Runterladen des Logs. Habe es gemacht wie beschrieben: Im Flow auf die drei Punkte geklickt, dann auf "Debug Modus" geklickt und den Flow laufen lassen. Es gibt aber keinen Button zum Runterladen:


image


Hmm, hat nicht geklappt, ich sehe keine Schaltfläche für das Runterladen des Logs. Habe es gemacht wie beschrieben: Im Flow auf die drei Punkte geklickt, dann auf "Debug Modus" geklickt und den Flow laufen lassen. Es gibt aber keinen Button zum Runterladen:

image


image


Zwecks Debug-Modus: Du musst genau auf die Checkbox klicken um es zu aktivieren. Es sollte anschließend eine Meldung kommen, dass der HTTP-Log aktiviert wurde.

Wenn du das allerdings schon gemacht hast, kann es auch daran liegen, dass du kurz nach dem ausführen des Flows die Seite aktualisieren(F5) musst.

Sind kleinere Unschönheiten, um die wir uns kümmern.

Okay, habe es gefunden, danke. Zum Thema selbst: Das wurde übermittelt:


2019-02-12 16:09:51,160 http-outgoing-5668 >> "Content-Disposition: form-data; name="body"; filename="body.json"[\r][\n]"

2019-02-12 16:09:51,160 http-outgoing-5668 >> "Content-Type: application/octet-stream[\r][\n]"

2019-02-12 16:09:51,160 http-outgoing-5668 >> "[\r][\n]"

2019-02-12 16:09:51,160 http-outgoing-5668 >> "{ "referenceWebshop":37926,"referenceCustomer":1026,"


usw., hier kommt der ganze JSON-string


Die API kommt leider mit "Content-Disposition: form-data; name="body"; filename="body.json"[\r][\n]" nicht klar - sie kann keine Datei verarbeiten. Soweit ich es verstehe, bräuchte sie das hier:


2019-02-12 16:09:51,160 http-outgoing-5668 >> "Content-Disposition: form-data; name="body"[\r][\n]"

2019-02-12 16:09:51,160 http-outgoing-5668 >> "Content-Disposition: form-data; name="type"[\r][\n]"

2019-02-12 16:09:51,160 http-outgoing-5668 >> "[\r][\n]"

2019-02-12 16:09:51,160 http-outgoing-5668 >> "{ "referenceWebshop":37926,"referenceCustomer":1026,"

usw.


Seht ihr eine Chance es zuzulassen, daß man Daten mit "form-data" direkt mit dem Body-String übermittelt statt die JSON-Datei zu schicken, aber trotzdem mit "form-data"?


Gruß Micha

Wir müssen da mal drüber nachdenken, wie wir das realisieren ohne bestehende Flows zu beeinflussen (kaputt zu machen...).

Wir melden uns.

Das wäre toll. Vielleicht bin ich an der Stelle zu unwissend, aber könnte man nicht die Option "multipart/form-data" in die Liste der möglichen Body Content-Types integrieren?

image


Dann kann doch eigentlich bei bestehenden Flows auch nichts schiefgehen.

Ja es geht in die Richtung. Da es aber ein Freitextfeld ist (du kannst da selbst was eintragen... sind nur Vorschläge) müssen sichergehen, dass das auch bei Kunden funktioniert, die da evtl. schon Multipart eingetragen haben.

Hallo Micha,


du kannst den bodyContentType jetzt auf multipart/form-data; charset=ISO-8859-1 stellen...

...und anschließend in den Request Body deine body=JSON einfügen.



Das Ergebnis sieht dann folgendermaßen aus:



Ich hoffe das es dir weiterhilft,

VG Torsten



Hallo Torsten,


ihr seid Spitze! Hat gerade wunderbar geklappt, übrigens auch im ApiCall-Step mit entsprechenden Einstellungen.


Danke und Gruß,


Micha