步骤 3b:使用 WCF-WebHttp 适配器从 Salesforce 检索机会详细信息
在本部分中,我们将改进业务流程,以处理传入的机会通知,从通知中提取机会名称,并使用该名称创建请求查询,以发送到 Salesforce。 此请求检索与机会关联的产品的特定详细信息。 Salesforce 的查询响应将接收回BizTalk Server。 为此,我们将执行以下步骤:
创建用于向 Salesforce 发送查询消息的架构和消息变量。
创建映射,以使用机会通知中的值创建查询,来检索与机会关联的产品详细信息。
创建用于从 Salesforce 接收查询响应的架构。
为请求和响应架构创建消息变量。
创建用于向 Salesforce 发送查询消息的架构和消息变量
若要使用通过机会通知提供的信息从 Salesforce 检索产品详细信息,我们需要向 Salesforce 发送查询。 查询将作为一条 XML 消息发送到 Salesforce。 因此,在下面的过程中,我们将创建请求消息架构。 在随后的过程中,我们会将机会通知架构与此架构相映射,以构造用于检索机会的产品详细信息的查询。
创建用于发送查询请求的架构
将新架构添加到BizTalk Server项目。 将它命名为
QueryRequest.xsd
。将根节点重命名为
QueryRequest
。 在 QueryRequest 记录下添加一个子字段元素,并将其命名为Query
。提升架构中的 Query 元素,使其可在业务流程中使用。 在后面的步骤中,我们将使用此已升级的元素分配查询字符串。
右键单击 Query 元素,指向“ 提升”,然后单击“ 快速升级”。 这将导致使用 Query 元素创建 PropertySchema.xsd 架构。 请记下 PropertySchema 的命名空间。 在 BizTalk Server 管理控制台中配置物理端口时,你将在以后的步骤中用到此端口。
保存所有更改。
将机会通知架构映射到查询架构
若要检索与机会关联的产品详细信息,我们需要向 Salesforce 发送如下查询:
SELECT Amount, Id, Name,(SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems) FROM Opportunity Where Name = '<opportunity_name>'
在前面的过程中,我们已创建了查询消息架构。 在此过程中,我们将机会通知架构映射到查询请求架构,并使用 functoid 构造此查询。 此查询将作为值传递给 QueryRequest.xsd 架构中的 Query 元素。
映射机会通知
将映射添加到BizTalk Server项目。 将映射
Notification_QueryRequest.btm
命名为 。将源架构设置为 NotificationService_soap_sforce_com_2005_09_outbound.xsd。 将目标架构设置为 QueryRequest.xsd。
将 字符串串联 functoid 添加到映射图面。 打开 “配置字符串连接 Functoid ”对话框并指定输入值,如下所示:
输入 值 Input[0] SELECT Amount, Id, Name,(SELECT Quantity, ListPrice, PricebookEntry.UnitPrice, PricebookEntry.Name FROM OpportunityLineItems) FROM Opportunity Where Name = ' Input[1] 将源架构中的 Name 元素连接到 functoid,以使用 Name 元素的值作为第二个输入。 Input[2] ' 注意: 对于最后一个输入值,请仅指定右引号 (') 。 以下屏幕截图描述了 String Concatenate functoid 的配置。
当三个输入参数连接在一起时,将形成要发送到 Salesforce 的所需查询。
将“字符串连接”functoid 连接到目标架构中的 Query 元素,如下面的屏幕快照中所示。
保存对映射所做的更改。
创建用于接收查询响应消息的架构
在本部分中,我们将创建用于从 Salesforce 接收查询响应消息的架构。 在本部分中,我们将手动创建查询响应架构。
创建用于接收查询响应的架构
将新架构添加到BizTalk Server项目,并将其命名为
QueryResult.xsd
。Salesforce QueryResult 对象描述从 Salesforce 收到的查询响应。 因此,我们将构建一个描述以下内容的架构:
<?xml version="1.0" encoding="utf-16" ?> - <xs:schema xmlns="http://BtsSalesforceIntegration.QueryResult" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" targetNamespace="http://BtsSalesforceIntegration.QueryResult" xmlns:xs="http://www.w3.org/2001/XMLSchema"> - <xs:element name="QueryResult"> - <xs:complexType> - <xs:sequence> <xs:element name="done" type="xs:string" /> - <xs:sequence> - <xs:element name="records"> - <xs:complexType> - <xs:sequence> <xs:element name="Id" type="xs:string" /> <xs:element name="Amount" type="xs:string" /> <xs:element name="Name" type="xs:string" /> - <xs:sequence> - <xs:element name="OpportunityLineItems"> - <xs:complexType> - <xs:sequence> <xs:element name="done" type="xs:string" /> - <xs:sequence minOccurs="1" maxOccurs="unbounded"> - <xs:element name="records"> - <xs:complexType> - <xs:sequence> <xs:element name="Quantity" type="xs:string" /> <xs:element name="ListPrice" type="xs:string" /> - <xs:element name="PricebookEntry"> - <xs:complexType> - <xs:sequence> <xs:element name="UnitPrice" type="xs:string" /> <xs:element name="Name" type="xs:string" /> </xs:sequence> <xs:attribute name="type" type="xs:string" /> <xs:attribute name="url" type="xs:string" /> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="type" type="xs:string" /> <xs:attribute name="url" type="xs:string" /> </xs:complexType> </xs:element> </xs:sequence> <xs:element name="totalSize" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:sequence> <xs:attribute name="type" type="xs:string" /> <xs:attribute name="url" type="xs:string" /> </xs:complexType> </xs:element> </xs:sequence> <xs:element name="totalSize" type="xs:string" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
架构结构应如下所示:
保存对架构所做的更改。
为 QueryRequest 和 QueryResult 架构创建消息变量
在创建 QueryRequest 和 QueryResult 架构后,你必须在业务流程中创建两个消息变量来表示这两种消息类型。
创建消息变量
打开 NotificationService.odx 业务流程,在业务流程视图中添加两条新消息。 将消息名称设置为
QueryRequestMsg
和QueryResultMsg
。将 QueryRequestMsg 的消息类型设置为 BtsSalesforceIntegration.QueryRequest。
将 QueryResultMsg 的消息类型设置为 BtsSalesforceIntegration.QueryResult。
保存对业务流程所做的更改。
更新业务流程以将消息发送到 Salesforce 并接收响应
在主题步骤 3a:将 Salesforce 商机通知接收到 BizTalk Server 中,我们构建了从 Salesforce 接收商机通知并发送确认的业务流程。 在此步骤中,我们将在此业务流程的基础上构建,以将查询请求发送到 Salesforce 来获得与机会相关的产品详细信息并接收响应。 我们已创建了将在此步骤中使用的架构(QueryRequest.xsd 和 QueryResult.xsd)和消息变量(QueryRequestMsg 和 QueryResultMsg)。
向 Salesforce 发送查询请求和接收响应
在 SendNotificationAck 形状后面添加构造消息形状。 将形状的名称设置为
ConstructQuery
,并将 Messages Constructed 属性设置为 QueryRequestMsg。在 ConstructQuery 形状中,添加 转换 形状。 双击“转换”形状以打开“转换配置”对话框。 在对话框中,选择“ 现有地图 ”选项,然后从下拉列表中选择 “BtsSalesforceIntegration.Notification_QueryRequest”。 将 “源” 设置为 “NotificaitonMessage”,将 “目标 ”设置为 “QueryRequestMsg”,然后单击“ 确定”。
在 “ConstructQuery” 形状中,在“转换”形状之后,添加“消息分配”形状。 双击“消息赋值”形状并添加以下表达式:
QueryRequestMsg(BtsSalesforceIntegration.PropertySchema.Query) = QueryRequestMsg.Query;
通过执行此操作,我们将 QueryRequestMsg 架构中 Query 元素的值传递给属性架构中的提升元素 Query。 配置 WCF-WebHttp 端口时,我们将使用此元素将查询值动态传递到请求消息。
在 “ConstructQuery” 形状之后,添加“发送”形状。 将形状
SendQueryRequest
命名为 ,并将消息类型设置为 QueryRequestMsg。在“发送”形状之后,添加“接收”形状并将其命名为
ReceiveQueryResult
。 将形状的消息类型设置为 QueryResultMsg。添加端口以向 Salesforce 发送查询请求,并接收作为响应的查询结果。 在“端口配置”向导中,选择以下选项:
将端口名称指定为
SalesforceRESTInterface
。选择用于创建新的端口类型的选项。
将 “通信模式 ”设置为 “请求-响应”。
将 “通信的端口方向 ”设置为 “我将发送请求并接收响应 ”,并将 “端口绑定 ”设置为 “稍后指定”。
将端口的请求操作连接到发送形状 (SendQueryRequest) 并将端口的响应操作连接到 Receive 形状 (ReceiveQueryResult) 。 下面的屏幕快照描述了业务流程的一部分,它表示向 Salesforce 发送查询请求并接收响应的流程。
在本主题中,我们更新了业务流程以向 Salesforce 发送查询请求,并接收与 Salesforce 中创建的机会有关的详细信息(如产品、数量等)。 在随后的主题中,我们将更新此解决方案,以将 Salesforce 响应输入到本地的 SQL Server 数据库。