REST Batching

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

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

     

    --Gawain

  • 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/.



    [edited by: David Frederick at 4:46 PM (GMT -6) on 24 Jul 2017]
  • 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?

  • Hi Christopher,

    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?

     

    --Gawain

  • (duplicate)



    [edited by: Gawain Lavers at 2:27 PM (GMT -6) on 26 Jul 2017]
  • Sorry, nevermind, found it.  Now I get a different error at least!

     

    (Update: wrong content-type)

     

    Okay, so now it just fails silently.  That's something, I guess?

     

     



    [edited by: Gawain Lavers at 2:39 PM (GMT -6) on 26 Jul 2017]
  • It wasn't, and now I get the same error I get through the built-in REST client.  Oh well.  Oddly, I didn't need it to run some other (not Batch) methods correctly.

  • Gawain, hoping this helps a bit:

    in your batch request above, try moving Content to the first element.  Using XML, the elements need to be alphabetically ordered in your request.  It's not seeing Content first and deserializing it as NULL.

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

    I have one final note regarding custom and batching.  At this time, the Custom resources are not supported in Batch requests.  The Batch service relies heavily on known service entities (like 'Constituent', 'PriceType', e.g.) to build its requests and responses.  Custom resources are by their nature ad hoc and dynamic and the capabiliity of building requests based on these does not exist in the service.

    Hope to see you at TLCC!

    -Ryan Creps

    Tessitura Network