Web services SOAP请求在集成代理中失去价值(PT8.52.14)
我设置了一个文档消息,以便在同步服务操作中使用它。我已经发布了这项服务,并且正在使用内置的service Operation Tester,它可以直接通过PeopleTools>Integration Broker>service Utilities>service Operation Tester菜单获得 我的问题:当我发送一个包含一些值的请求,然后在同步服务监视器中查看它时,我再也看不到它们了。在某个时候,IntegrationBroker刷新了这些值,我无法确定这是一个已知的bug,还是我的设置中可能有错误的地方 注:Web services SOAP请求在集成代理中失去价值(PT8.52.14),web-services,soap,peoplesoft,Web Services,Soap,Peoplesoft,我设置了一个文档消息,以便在同步服务操作中使用它。我已经发布了这项服务,并且正在使用内置的service Operation Tester,它可以直接通过PeopleTools>Integration Broker>service Utilities>service Operation Tester菜单获得 我的问题:当我发送一个包含一些值的请求,然后在同步服务监视器中查看它时,我再也看不到它们了。在某个时候,IntegrationBroker刷新了这些值,我无法确定这是一个已知的bug,还是我
- 请求和响应是相同的消息
- 文档中的每个字段都有一个长度和类型集
- 非基于行集的消息没有问题
- 我正在使用Peopletools 8.52.14
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nx="http://xmlns.oracle.com/Enterprise/Tools/schemas/NX_PAC.NX_IB_PERFS_EVENT.VERSION_2a">
<soapenv:Header/>
<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<NX_IB_PERFS_EVENT xmlns="http://xmlns.oracle.com/Enterprise/Tools/schemas/NX_PAC.NX_IB_PERFS_EVENT.VERSION_2a">
<EventName>XYZ</EventName>
<PerfsDate>2015-02-09</PerfsDate>
<AverageTiming>0.0</AverageTiming>
<NumberOfExec>0.0</NumberOfExec>
<AveragePost>0.0</AveragePost>
</NX_IB_PERFS_EVENT>
</soapenv:Body>
</soapenv:Envelope>
我发回请求消息,然后在标签PerfsDate
上设置一个日期
在响应消息中,EventName
的值为空
对此有任何反馈吗?看起来您没有从请求消息中正确检索值。下面是如何从Integration Broker同步SOAP请求检索值的示例:
method OnRequest
/+ &_msg as Message +/
/+ Returns Message +/
/+ Extends/implements PS_PT:Integration:IRequestHandler.OnRequest +/
Local XmlDoc &requestXmlDoc;
Local XmlNode &requestRootNode;
Local array of XmlNode &perfsDateNodes, &avgTimingNodes;
Local string &perfsDateStr, &avgTimingStr;
Local date &perfsDate;
Local number &avgTiming;
&requestXmlDoc = &_msg.GetXmlDoc();
&requestRootNode = &requestXmlDoc.DocumentElement;
&perfsDateNodes = &requestRootNode.GetElementsByTagName("PerfsDate");
If &perfsDateNodes.Len > 0 Then
&perfsDateStr = &perfsDateNodes[1].NodeValue;
If IsDate(&perfsDateStr) Then
&perfsDate = DateValue(&perfsDateStr);
Else
/* some error */
End-If;
Else
/* some error */
End-If;
&avgTimingNodes = &requestRootNode.GetElementsByTagName("AverageTiming");
If &avgTimingNodes.Len > 0 Then
&avgTimingStr = &avgTimingNodes[1].NodeValue;
If IsNumber(&avgTimingStr) Then
&avgTiming = Value(&avgTimingStr)
Else
/* some error */
End-If;
Else
/* some error */
End-If;
Return &This.CreateSOAPResponse(false, &avgTiming, &perfsDate, "No Error");
End-Method;
我还将创建一个单独的方法或类来创建响应消息
例如:
/**
* Create a SOAP response message based on the schema of the response message
*
*/
method CreateSOAPResponse
/+ &hasError as Boolean, +/
/+ &avgTiming as Number, +/
/+ &perfsDate as Date, +/
/+ &errorMessage as String +/
/+ Returns Message +/
Local SOAPDoc &responseSOAP;
Local XmlDoc &responseXmlDoc;
Local XmlNode &resultNode;
Local Message &responseMessage;
Local string &perfsDateStr, &avgTimingStr;
If &hasError Then
/* In the event of an error condition, certain response fields should be blank. */
&avgTiming = "";
&perfsDate = "";
Else
&errorMessage = "";
End-If;
/* Convert the number and date to string for response.*/
If All(&avgTiming) Then
&avgTimingStr = NumberToString("%*.*", &avgTiming);
Else
&avgTimingStr = "";
End-If;
If All(&perfsDate) Then
&perfsDateStr = DateTimeToLocalizedString(&perfsDate, "yyyy-MM-dd");
Else
&perfsDateStr = "";
End-If;
&responseSOAP = CreateSOAPDoc();
&responseSOAP.AddEnvelope(%SOAP_Schema);
&responseSOAP.AddHeader();
&responseSOAP.AddBody();
&responseSOAP.AddMethod("SERVICE_OPERATION NAME", 0);
&resultNode = &responseSOAP.MethodNode;
&resultNode.AddAttribute("xmlns:tns", "NAMESPACE/RESPONSE_MESSAGE_NAME");
&responseSOAP.AddParm("errorMessage", &errorMessage);
&responseSOAP.AddParm("AverageTiming", &avgTimingStr);
&responseSOAP.AddParm("PerfsDate", &perfsDateStr);
&responseMessage = CreateMessage(Operation.OPERATION_NAME_HERE, %IntBroker_Response);
&responseMessage.SetXmlDoc(&responseSOAP.XmlDoc);
Return &responseMessage;
end-method;
希望有帮助。此解决方案无法处理文档消息。如果您使用这样的消息运行它,IB将发回“此方法只能由基于非行集的消息使用。(2852)”,参考GetXmlDoc();我刚刚意识到您正在执行基于行集的消息传递。很抱歉,我应该更仔细地阅读您的问题。您需要使用GenXMLString()来创建包含XML数据的字符串对象,而不是GetXmlDoc。然后可以解析XML并查看消息中出现的内容。我不确定是什么导致了您所描述的问题,但我认为这是因为您将消息视为非基于行集的消息。您应该在其中的某个地方使用记录和行集对象类型,因为这是您通常处理它们的方式。它也不是基于行集的消息,而是文档消息,是Ptools 8.50引入的一种新类型。文档允许您描述数据的结构,并获得一个方便的对象来轻松地操作它。。。但愿它能起作用:)
/**
* Create a SOAP response message based on the schema of the response message
*
*/
method CreateSOAPResponse
/+ &hasError as Boolean, +/
/+ &avgTiming as Number, +/
/+ &perfsDate as Date, +/
/+ &errorMessage as String +/
/+ Returns Message +/
Local SOAPDoc &responseSOAP;
Local XmlDoc &responseXmlDoc;
Local XmlNode &resultNode;
Local Message &responseMessage;
Local string &perfsDateStr, &avgTimingStr;
If &hasError Then
/* In the event of an error condition, certain response fields should be blank. */
&avgTiming = "";
&perfsDate = "";
Else
&errorMessage = "";
End-If;
/* Convert the number and date to string for response.*/
If All(&avgTiming) Then
&avgTimingStr = NumberToString("%*.*", &avgTiming);
Else
&avgTimingStr = "";
End-If;
If All(&perfsDate) Then
&perfsDateStr = DateTimeToLocalizedString(&perfsDate, "yyyy-MM-dd");
Else
&perfsDateStr = "";
End-If;
&responseSOAP = CreateSOAPDoc();
&responseSOAP.AddEnvelope(%SOAP_Schema);
&responseSOAP.AddHeader();
&responseSOAP.AddBody();
&responseSOAP.AddMethod("SERVICE_OPERATION NAME", 0);
&resultNode = &responseSOAP.MethodNode;
&resultNode.AddAttribute("xmlns:tns", "NAMESPACE/RESPONSE_MESSAGE_NAME");
&responseSOAP.AddParm("errorMessage", &errorMessage);
&responseSOAP.AddParm("AverageTiming", &avgTimingStr);
&responseSOAP.AddParm("PerfsDate", &perfsDateStr);
&responseMessage = CreateMessage(Operation.OPERATION_NAME_HERE, %IntBroker_Response);
&responseMessage.SetXmlDoc(&responseSOAP.XmlDoc);
Return &responseMessage;
end-method;