Has anyone had any success batching REST calls together with the batch service methods?
We are currently on V11 in a RAMP environment and I'm having some issues with this. I am get the error "Object reference not set to an instance of an object." for any service URI I enter (local, relative, or even web.
I'm really stuck on this right now and I'm not sure if this is a V11, RAMP, or coding or other random issue.
Here is my current POST body to https://fairlb/testapi/constituentservice/constituents/batch from within my RAMP terminal (local to the gateway):
<BatchRequest>
<Requests>
<Request>
<Id>1</Id>
<Uri>https://fairlb/testapi/constituentservice/constituents/5</Uri>
<HttpMethod>GET</HttpMethod>
</Request>
</Requests>
</BatchRequest>
Has anyone had similar issues in a non-RAMP environment?
-Chris
Hi Chris,
It's a little tricky with the dataservice because it does not know about the objects you are trying to batch, so you have to use the content type of a:XElement like below:
<BatchRequest xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Content i:type="a:XElement" xmlns:a="http://schemas.datacontract.org/2004/07/System.Xml.Linq">
<CustomThing>
<CustomColumn>1</CustomColumn>
</CustomThing>
</Content>
<HttpMethod>POST</HttpMethod>
<Uri>https://website.com/testapi/tessituraservice/custom/customthings/</Uri>
<Id>2</Id>
<Uri>https://website.com/testapi/tessituraservice/custom/customthings/1</Uri>
Thanks Paul-- That will probably save me some extra headaches in the future. Seems my GET call is matching yours, though, so I'm still unsure of what might be wrong with my base calls.
Do you know if the API loops back through the network to make the batch calls? I'm still not entirely sure of the stack behavior when it comes to these Batch methods
I just tried your exact example, changing only address type, constituent ID, and Uri, and it worked for me. I'm on 12.5.1HF12.
12.5.1's REST Client does have a rudimentary JSON example, but the only other things it demonstrates are some properties on the request: a "ReturnTypeString" which doesn't appear to have any affect, "ContinueOnError": true (maybe something to try), and "DependsOnRequests", which it gives absolutely no explanation of.
I just tried your exact example, changing only address type, constituent ID, and Uri, and it work for me. I'm on 12.5.1HF12.
Thanks for the confirmation! I think I'll try bumping this to support if I have the outline of my syntax right.
"DependsOnRequests" is my next step!
Hi Nick,
Did you say you were able to get this Batch call to work? Tessitura has just told me that there is a defect with JSON and Batch calls that is currently under development, and have suggested I switch to XML (blech).
--Gawain
What version and hotfix are you on?
I can make this request as JSON just fine
Thanks Christopher...I'm not 100% sure, is that something I can easily look up? The version # is 12.5.1.216.
Ah, here we go, dbo.FS_CURRENT_VERSION():
12.5.1+HF44 216
So, Hotfix 44?
That is strange I don't think that you should have a problem then.
Have you tried XML with success? What are your headers set to?
I tried to break this earlier and I was getting fairly responsive errors, it seems that the conversion was happening fine with data structure you had provided.
Hi Christopher,
I've asked Tessitura Support if this was an issue introduced by a hotfix, in case having a higher HF is what is causing me to have the problem and not you guys.
I tried XML (Tessitura Support recommended it as a workaround), but I'm having no success there either.
Here's what I'm plugging in (now almost identical to the code snipped in the documentation):
<BatchRequest> <Requests> <Request> <HttpMethod>POST</HttpMethod> <Id>1</Id> <Uri>http://calplb/TestAPI/TessituraService/CRM/Addresses/</Uri> <Content i:type="address" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <Constituent><Id>20335666</Id></Constituent> <Addresstype><Id>14</Id></Addresstype> <Street1>111 Nob Hill Crescent</Street1> <City>San Francisco</City> <State><Id>11</Id></State> <PostalCode>94109</PostalCode> <Country><Id>1</Id></Country> <Label>True</Label> <PrimaryIndicator>False</PrimaryIndicator> <Months>YYYYNNNNYYYY</Months> </Content> </Request> </Requests> </BatchRequest>
And here's the error I'm getting back:
<BatchResponse xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <BatchFailed>true</BatchFailed> <Responses> <Response> <ErrorMessages> <ErrorMessage> <Code>FIELD_CANNOT_BE_NULL</Code> <Description>Field 'entity' cannot be null or empty.</Description> <Details i:nil="true" /> <ErrorPath>entity</ErrorPath> </ErrorMessage> </ErrorMessages> <RequestId>1</RequestId> <ResponseObject i:nil="true" /> <StatusCode>BadRequest</StatusCode> </Response> </Responses> </BatchResponse>
Interesting.
We are on HF48 right now and are getting scheduled for 49 this week, so if that's the case it must have gotten un-borked.
Maybe update and report back if you still have any issues?
Upgraded to HF48, but no change. Not surprised, frankly. Something else is clearly wrong.
In the meantime, trying to work around not being able try things out in Batch, I'm realizing that I might have a bigger problem. My assumption was that I was going to build some procedures to call through Custom/Execute, and I was going to used returned ids to fill in dependent procedures. However, Custom/Execute isn't going to return columns in a way that I think can be referenced by the DependsOnRequest...and if did, I wouldn't be able to apply it to the dependent call to Custom/Execute since the parameters are all bunged together in a single object ("Parameters").
I'm trying to figure out TR_DATASERVICE, but documentation is even more scanty for that, particularly for formatting POST and PUT commands.
Say Christopher/Nick,
When you were running this, were you doing it through the provided Rest Client (that's what I'm doing), or via cURL or the .Net libraries?
I was just using the REST client provided in the services web interface.
Hi Gawain - Postman is a useful REST client. It's one I use on a regular basis: https://www.getpostman.com/.
I also used Postman to test this.
The only thing I can think of if the client is the issue would be if you're not sending the response body explicitly and there is a serialization issue with the JSON object that is being sent for the batch call [sending a serialized .NET object somehow?].
Have you tried to connect to your gateway outside of .NET at all?
I'm trying Postman to at least rule out whether or not the built-in client is my problem, but I'm not sure I'm doing it right: I changed to bulk edit for parameters and then copied and pasted in the request data, but I'm not sure that's right. Is there somewhere else to enter request data, or does it need to be formatted in a different way?
(duplicate)