โ05-12-2021 11:05 AM
Iโm trying to use an API to post data to an application.
There is no account. Instead I have a specific account.
The curl API looks like this:
curl https://communicate.modolabs.net/api/v1/directories/revisions --header โAuthorization: Token myTokenโ --form โname=Modo Testโ --form โupload=@directory.xmlโ where โmyTokenโ would be the token I was given.
How do I convert this to the REST Snap?
โ05-18-2021 04:09 PM
Hi Bob:
I will follow-up tomorrow (Wed, 5/19) with an example of how to do this.
โ05-19-2021 04:24 PM
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--
โ05-20-2021 03:19 PM
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--
โ08-04-2021 05:41 AM
@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.