Posting an ARRAY field with REST

  • 1
  • Problem
  • Updated 12 months ago
  • Solved
  • (Edited)
I've been working with Shippo, which offers a shipping API for creating labels, tracking, and address verification. I set it up a REST interface quite easily, and was able to get most standard operations working well. The problem I have is when it comes to multi-piece shipments which requires that I post an array of 'parcels'.  Let me explain.

Shippo has you create a To Address object, a From Address object, and a Parcel object (with dimensions & weight). Once created each is given an Object ID. To create the shipment you just supply all three object IDs and the shipment is created. Here is what it looks like basically.


Pretty simple. But if you want to send multi-piece shipments you have to supply an array of Parcel object IDs, formatted like this ['object_id', 'object_id']. No problem creating that string, but there is an issue with the JSON generated from Skuid. 

Here is what is required. 


{

    "object_purpose": "PURCHASE",

"address_from": "4f406a13253945a8bc8deb0f8266b245",

"address_to": "4c7185d353764d0985a6a7825aed8ffb"

"parcel": ["3b1e9b81ef92451c9e613a82128988d5", "6a2f479f1b1c43dfb9d98234ed720e47"],

    "async": false

}


But instead Skuid is adding extra Quotations around the parcel list. Which makes sense because it thinks it is sending a simple text field, like below.. 


{

    "object_purpose": "PURCHASE",

"address_from": "4f406a13253945a8bc8deb0f8266b245",

"address_to": "4c7185d353764d0985a6a7825aed8ffb"

"parcel": "    ["3b1e9b81ef92451c9e613a82128988d5", "6a2f479f1b1c43dfb9d98234ed720e47"]   ",

    "async": false

}

This results in an error with the external data source, it isn't expecting the extra quotes.  So finally my question.  Thanks if you made it this far.

Is there a way to prevent Skuid from adding the extra quotes around the 'array' of object IDs? Anyway to prevent it from treating it as a string and putting it in quotes at all? Or is there a way to custom specify the JSON post with a snippet? 

Really appreciate any help with this. I've been following this community for some time now, just my first time posting. 

Andy
Photo of Andy Shipsides

Andy Shipsides

  • 430 Points 250 badge 2x thumb

Posted 2 years ago

  • 1
Photo of Zach McElrath

Zach McElrath, Employee

  • 49,056 Points 20k badge 2x thumb
In the Model, what is the field's Display Type? Is the Display Type set to Text, or Array?
Photo of Andy Shipsides

Andy Shipsides

  • 430 Points 250 badge 2x thumb
It is Text. I do not have Array as an option for display type. 
Photo of Zach McElrath

Zach McElrath, Employee

  • 49,056 Points 20k badge 2x thumb
Okay, that makes sense - I think Array is not presented as an option unless the field is identified as an Array during initial parsing of the REST query's sample response. If you View/Exit XML for the page, and find the corresponding Model Field's <field /> XML node, you can change the "displaytype" to ARRAY. Try that and see if that changes how Skuid sends the data to the data source.
Photo of Andy Shipsides

Andy Shipsides

  • 430 Points 250 badge 2x thumb
Hmm.. tried that. I get an error..  'TypeError: invalid 'in' operand a' 
Photo of John Dahlberg

John Dahlberg, Champion

  • 2,474 Points 2k badge 2x thumb
Did this item get resolved?  I believe I'm running into a similar issue.  I'm working on a REST chatter POST, which requires multiple Arrays to be passed in and the nodes in the array not being wrapped in brackets:


The messageSegments and capabilities nodes should be presented as arrays.  I have them setup in the model as such, but they aren't wrapping correctly.  When I do a query on the same model, the response is returned in the correct format, so this looks isolated to the post method.

Here's the model definition:

        <model id="NewModel" query="true" createrowifnonefound="true" datasource="SalesforceRest" processonclient="true" type="readwrite" fieldtargetobjects="elements">
            <fields>
                <field id="capabilities.files.items.id" displaytype="TEXT"/>
                <field id="visibility" displaytype="TEXT"/>
                <field id="feedElementType" displaytype="TEXT"/>
                <field id="capabilities.files.items" displaytype="ARRAY"/>
                <field id="subjectId" displaytype="TEXT"/>
                <field id="body.messageSegments.type" displaytype="TEXT"/>
                <field id="body.messageSegments.text" displaytype="TEXT"/>
                <field id="body.messageSegments" displaytype="ARRAY"/>
            </fields>
            <conditions/>
            <actions/>
            <methods>
                <method type="insert" verb="POST" endpoint="/chatter/feed-elements/" pathtocontent="elements" successif="requestsucceeds" sendchanges="asjsoninbody" insertresponse="recordinbody"/>
                <method type="query" verb="GET" endpoint="/chatter/feed-elements/?q=template" pathtocontent="elements" fieldtargetobjects="elements"/>
            </methods>
        </model>