Forum Discussion
Hi Bob:
I will follow-up tomorrow (Wed, 5/19) with an example of how to do this.
- mbowen5 years agoEmployee
Hi Bob:
I’m still working on the example. It’s a little trickier than I thought. I’ve been inspecting and reconciling request payloads. I am closer to matching a curl request against an echo server (shown below). Contents of directory.xml is just arbitrary xml. Hope to have example finished soon. Thanks for your patience.
POST / HTTP/1.1 Authorization: myToken Accept: */* User-Agent: curl/7.68.0 Host: 127.0.0.1:3000 Content-Length: 387 Content-Type: multipart/form-data; boundary=------------------------5217129846a80aae --------------------------5217129846a80aae Content-Disposition: form-data; name="name" Modo Test --------------------------5217129846a80aae Content-Disposition: form-data; name="upload"; filename="directory.xml" Content-Type: application/xml <directory name="foo"> <file>file1.txt</file> <file>file2.json</file> </directory> --------------------------5217129846a80aae--
- mbowen5 years agoEmployee
Hi Bob:
Disclaimer: I’m familiar with many of our snaps, but actually haven’t done much with our REST snaps. So, maybe others in the Community will chip in with extra explanation or solutions.
Here is a solution that may work. The pipeline is just a single REST POST snap. You’ll see that the REST snap inserts a few extra attributes that Curl doesn’t which may be ok (ex: Content-Transfer-Encoding: binary).
File: value1.txt Mondo Test File: directory.xml <directory name="foo"> <file>file1.txt</file> <file>file2.json</file> </directory>
My Service URL points to a local echo server. You’ll see that I encoded the “name” property value into a file – not super pretty, but gets us close to the representation that we want. I uploaded the file (sldb://), but file could also be referenced on file system (file://).
For our “name” property, I put an “x” for the filename to indicate that really don’t care about this. If left blank, it will be substituted with the name of the uploaded file (ie, “value1.txt”).
A couple other observations. Upload Body Type is Multipart FORM-DATA. HTTP entity fields are empty. These fields are ignored for multipart form-data.
Here is the generated request payload.
Accept=[*/*] Connection=[Keep-Alive] Host=[127.0.0.1:8001] Transfer-encoding=[chunked] Authorization=[Token <my-token>] Content-type=[multipart/form-data; boundary=Kz659krJ927tbvVX9g5Wwe9siMHfcZOUEqsZvKqr] --Kz659krJ927tbvVX9g5Wwe9siMHfcZOUEqsZvKqr Content-Disposition: form-data; name="name"; filename="x" Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: binary Mondo Test --Kz659krJ927tbvVX9g5Wwe9siMHfcZOUEqsZvKqr Content-Disposition: form-data; name="upload"; filename="directory.xml" Content-Type: application/xml; charset=UTF-8 Content-Transfer-Encoding: binary <directory name="foo"> <file>file1.txt</file> <file>file2.json</file> </directory> --Kz659krJ927tbvVX9g5Wwe9siMHfcZOUEqsZvKqr--
I’m not sure if filename=“x” will cause a problem with submission, but it’s not obvious how to not display this.
Another approach is to submit request as a Multipart RELATED type. This didn’t get me any closer, but thought I would document what I did anyway.
This pipeline includes a Mapper and REST Snap. I defined the form property in json under an “entity” key in a Mapper, and then referenced this variable in the HTTP Entity field of the REST snap.
In the generated request, this part is encoded as json content with a hard-coded “metaData” key. This key name is part of the Multipart RELATED plumbing and is not obvious how to override.
Here is the generated request payload for Multipart RELATED.
Accept=[*/*] Connection=[Keep-Alive] Host=[127.0.0.1:8001] Transfer-encoding=[chunked] Authorization=[Token <my-token>] Content-type=[multipart/related; boundary=2_cNQDNeLIqanSgxKib8BNkTrwuamXl] --2_cNQDNeLIqanSgxKib8BNkTrwuamXl Content-Disposition: form-data; name="metaData" Content-Type: application/json; charset=UTF-8 Content-Transfer-Encoding: 8bit { "name": "Modo Test" } --2_cNQDNeLIqanSgxKib8BNkTrwuamXl Content-Disposition: form-data; name="upload"; filename="directory.xml" Content-Type: application/xml; charset=UTF-8 Content-Transfer-Encoding: binary <directory name="foo"> <file>file1.txt</file> <file>file2.json</file> </directory> --2_cNQDNeLIqanSgxKib8BNkTrwuamXl--
- Sowmya_Rayavara5 years agoNew Contributor III
@mbowen: Did you get a solution? I have a similar requirement where I need to post multiple files to SnapLogic, the number of files and the content type.