Sunday, December 24, 2017

BizTalk 2013R2 REST API call, complete example

Overview


In this example you create an integration that reads in a simple xml file, extracts a value from it and uses the value to call a web service. The web service returns a JSON message that is transformed to xml in a pipeline. This new xml is then saved to a file.

Instructions

Setting up a mock service


Get Postman from https://www.getpostman.com/

Start Postman and select Mock Server



Define path and the response data





Now you can call your REST API


Creating the integration


Create a new Empty BizTalk Server Project



Define application name to properties








Sign the assembly



Add a New Item




Select BizTalk Orchestration






Create new configured port














Select the Receive shape and drag it to orchestration







Create a new schema file called testrequest_schema.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="testvalue">
<xs:simpleType>
<xs:restriction base="xs:string"/>
</xs:simpleType>
</xs:element>
<xs:element name="testrequest">
<xs:complexType>
<xs:sequence>
<xs:element ref="testvalue"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>


Create an XML file called testrequest.xml:

<?xml version="1.0" encoding="UTF-8"?>
<testrequest>
<testvalue>mytest</testvalue>
</testrequest>

In the Solution Explorer add an Existing Item and select the testrequest_schema.xsd:






Select the schema for the operation Operation_1



Create a new message and also in here select the same schema.








Create a new variable:






Add an Expression shape






In the expression editor add:

MyTestVariable = xpath(Message_1, "string(//*[local-name()='testrequest']/*[local-name()='testvalue'])");




Create a new System.String type message:



Add Contruct Message shape:



For messages constructed select Message_2



Select MessageAssignment shape and drag it into the ConstructMessage1:






Add new item, select Property Schema:






Rename Property1 to MyTestProperty:



For the MyTestProperty select MessageContextPropertyBase:



Create a new send port (configured port):







Drag a new Send shape and define Message and Operation:




Add the following code to the MessageAssignment (change the https address):

Message_2="";

Message_2(MyTestProperty) = MyTestVariable;

Message_2(WCF.VariablePropertyMapping)= @"<?xml version='1.0' encoding='utf-16'?>
   <BtsVariablePropertyMapping xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema'>
   <Variable Name='MyTestProperty' PropertyName='MyTestProperty' PropertyNamespace='https://REST_API_test.PropertySchema1' />
   </BtsVariablePropertyMapping>";

Message_2(WCF.HttpMethodAndUrl)=@"<BtsHttpUrlMapping> <Operation Method='GET' Url='/{MyTestProperty}' /></BtsHttpUrlMapping>";

Message_2(WCF.SecurityMode)="Transport";
//If using HTTP use SecurityMode 'None'
//Message_2(WCF.SecurityMode)="None";

Message_2(WCF.TransportClientCredentialType)="None";
Message_2(WCF.SuppressMessageBodyForHttpVerbs)="GET";

Port_RequestToMockService(Microsoft.XLANGs.BaseTypes.Address)="https://b0ec7649-23ff-4023-b7ea-a61ef7043127.mock.pstmn.io";
Port_RequestToMockService(Microsoft.XLANGs.BaseTypes.TransportType)="WCF-WebHttp";





Create message_3:



Add new item, select Receive Pipeline, this is needed because the response from the mock service is JSON:



Add JSON decoder and XML disassembler and define both Root Node and Root Node Namespace in the pipeline.



Allow unrecognized messages:



Add receive component and set Message as Message_3



In the port select the new pipeline:



Set Request message type System.String



Set response message type System.Xml.XmlDocument



Add a new send shape:



Create new configured port:







For the Send_2 select Message and Operation:



Build, and when you get "you must specify at least one already-initialized correlation set for a non-activation receive that is on a non-selfcorrelating port" activate the first receive shape:



Deploy

Create new one-way receive port




Create new receive location:







Create a new send port:



Define filters:



Define the ports for the orchestration:



Start the integration.

If everything went fine you should get the following XML file as a result:

<ns0:ResponseMessageRoot xmlns:ns0="http://tempuri.org/MyRESTAPITest">
  <fruit>Apple</fruit>
  <size>Large</size>
  <color>Red</color>
</ns0:ResponseMessageRoot>