Convert this to a snap? How?

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?

Hi Bob:
I will follow-up tomorrow (Wed, 5/19) with an example of how to do this.

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--

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.

form-related-pipeline

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--