使用 ColdFusion 解析 WSDL/SOAP
Using ColdFusion to parse WSDL/SOAP
我将 USERID 传递到我认为是 SOAP 请求的内容中。我从来没有使用过 SOAP,也不太确定从哪里开始,所以如果我的问题不太明白,请告诉我,我会尽力补充遗漏的细节。
问题背景:
我正在转换一个 excel 宏(宏将查询将用户 ID 传递给服务器,服务器将 return 员工详细信息,如姓名、电子邮件、地址等)并转换为网络查找.
我有以下代码:
<cfscript>
variables.sso = '55555';
variables.serverURL = "http://search.corporate.ge.com/ldq/Query";
variables.queryString = "?serverID=ssoprod&searchBase=ou=domainWorker,+o=domain.com&Prebuilt=true&scope=2&filter=(domainoraclehrid=#variables.sso#)";
variables.webservice = "#variables.serverURL##variables.queryString#";
</cfscript>
<cfdump var="#variables.webservice#">
<cfhttp url="#variables.webservice#" method="get" result="response"></cfhttp>
<cfdump var="#response.fileContent#" label="soap content">
当我从 variables.webservice 的转储中获取值并将其直接粘贴到浏览器中时,我得到以下内容(假设用户 ID 为 55555):
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dsml="http://www.dsml.org/DSML">
<SOAP-ENV:Body>
<dsml:dsml xmlns:dsml="http://www.dsml.org/DSML">
<dsml:directory-entries>
<dsml:entry dn="domainssouid=1D8B0D04-91F0-1CAE-9BD7-002128B20D70,ou=domainWorker, o=domain.com">
...
<dsml:attr name="employeetype">
<dsml:value>Contractor</dsml:value>
</dsml:attr>
<dsml:attr name="givenname">
<dsml:value>John</dsml:value>
</dsml:attr>
<dsml:attr name="postalcode">
<dsml:value>90210</dsml:value>
</dsml:attr>
<dsml:attr name="domainoraclehrid">
<dsml:value>456456987</dsml:value>
</dsml:attr>
<dsml:attr name="mail">
<dsml:value>John.Doe@domain.com</dsml:value>
</dsml:attr>
<dsml:attr name="cn">
<dsml:value>Doe, John</dsml:value>
</dsml:attr>
...
</dsml:entry>
</dsml:directory-entries>
</dsml:dsml>
</SOAP-ENV:Body>
但是当我转储 #response.fileContent# 时,我得到了一些不同的东西,我得到:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:f="http://www.w3.org/2001/06/soap-faults">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<SOAP-ENV:faultcode>MustUnderstand</SOAP-ENV:faultcode>
<SOAP-ENV:faultstring>ou=domainWorker,+o=domain.com: [LDAP: error code 34 - Invalid DN], Name Not valid - ou=domainWorker,+o=domain.com - filter -(domainoraclehrid=55555) </SOAP-ENV:faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
最终我想做的是解析出 "cn" 和 "mail" 细节。我在这里错过了什么?我怀疑这可能与我直接访问 URL(登录用户)有关,因为请求是从服务器发出的,而不是 "authenticated"。如果是这样,我该如何解决?
更新:
(最初,我对为什么我无法使用 CF2018 重现您的结果感到有点困惑,但现在我知道您使用的是 Lucee,所以差异是有道理的。)
查看成功的响应,我注意到它在 "o" (organization Name):
之前不包含 +
<dsml:entry dn="domainssouid=xxxx,ou=domainWorker, o=domain.com">
这意味着 VBA 调用将 +
视为 space 的编码,但 CFHTTP 将其编码为文字加号,导致错误,因为它中断 LDAP 查询:
[LDAP: error code 34 - Invalid DN], Name Not valid - ou=domainWorker,+o=domain.com
解决方案是去掉加号 +
并将其替换为 space:
searchBase=ou=domainWorker, o=domain.com
有趣的是,转储 http 请求数据表明 CF2018 显然做事不同。与 Lucee 不同,CF2018 将加号视为 space.
CF2018 => %20
(space)
searchBase=ou%3DdomainWorker%2C%20o%3Ddomain.com
Lucee 5.2.8.50 => %2B
(加号)
searchBase=ou%3DdomainWorker%2C%2Bo%3Ddomain.com
我将 USERID 传递到我认为是 SOAP 请求的内容中。我从来没有使用过 SOAP,也不太确定从哪里开始,所以如果我的问题不太明白,请告诉我,我会尽力补充遗漏的细节。
问题背景: 我正在转换一个 excel 宏(宏将查询将用户 ID 传递给服务器,服务器将 return 员工详细信息,如姓名、电子邮件、地址等)并转换为网络查找.
我有以下代码:
<cfscript>
variables.sso = '55555';
variables.serverURL = "http://search.corporate.ge.com/ldq/Query";
variables.queryString = "?serverID=ssoprod&searchBase=ou=domainWorker,+o=domain.com&Prebuilt=true&scope=2&filter=(domainoraclehrid=#variables.sso#)";
variables.webservice = "#variables.serverURL##variables.queryString#";
</cfscript>
<cfdump var="#variables.webservice#">
<cfhttp url="#variables.webservice#" method="get" result="response"></cfhttp>
<cfdump var="#response.fileContent#" label="soap content">
当我从 variables.webservice 的转储中获取值并将其直接粘贴到浏览器中时,我得到以下内容(假设用户 ID 为 55555):
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dsml="http://www.dsml.org/DSML">
<SOAP-ENV:Body>
<dsml:dsml xmlns:dsml="http://www.dsml.org/DSML">
<dsml:directory-entries>
<dsml:entry dn="domainssouid=1D8B0D04-91F0-1CAE-9BD7-002128B20D70,ou=domainWorker, o=domain.com">
...
<dsml:attr name="employeetype">
<dsml:value>Contractor</dsml:value>
</dsml:attr>
<dsml:attr name="givenname">
<dsml:value>John</dsml:value>
</dsml:attr>
<dsml:attr name="postalcode">
<dsml:value>90210</dsml:value>
</dsml:attr>
<dsml:attr name="domainoraclehrid">
<dsml:value>456456987</dsml:value>
</dsml:attr>
<dsml:attr name="mail">
<dsml:value>John.Doe@domain.com</dsml:value>
</dsml:attr>
<dsml:attr name="cn">
<dsml:value>Doe, John</dsml:value>
</dsml:attr>
...
</dsml:entry>
</dsml:directory-entries>
</dsml:dsml>
</SOAP-ENV:Body>
但是当我转储 #response.fileContent# 时,我得到了一些不同的东西,我得到:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:f="http://www.w3.org/2001/06/soap-faults">
<SOAP-ENV:Body>
<SOAP-ENV:Fault>
<SOAP-ENV:faultcode>MustUnderstand</SOAP-ENV:faultcode>
<SOAP-ENV:faultstring>ou=domainWorker,+o=domain.com: [LDAP: error code 34 - Invalid DN], Name Not valid - ou=domainWorker,+o=domain.com - filter -(domainoraclehrid=55555) </SOAP-ENV:faultstring>
</SOAP-ENV:Fault>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
最终我想做的是解析出 "cn" 和 "mail" 细节。我在这里错过了什么?我怀疑这可能与我直接访问 URL(登录用户)有关,因为请求是从服务器发出的,而不是 "authenticated"。如果是这样,我该如何解决?
更新:
(最初,我对为什么我无法使用 CF2018 重现您的结果感到有点困惑,但现在我知道您使用的是 Lucee,所以差异是有道理的。)
查看成功的响应,我注意到它在 "o" (organization Name):
之前不包含+
<dsml:entry dn="domainssouid=xxxx,ou=domainWorker, o=domain.com">
这意味着 VBA 调用将 +
视为 space 的编码,但 CFHTTP 将其编码为文字加号,导致错误,因为它中断 LDAP 查询:
[LDAP: error code 34 - Invalid DN], Name Not valid - ou=domainWorker,+o=domain.com
解决方案是去掉加号 +
并将其替换为 space:
searchBase=ou=domainWorker, o=domain.com
有趣的是,转储 http 请求数据表明 CF2018 显然做事不同。与 Lucee 不同,CF2018 将加号视为 space.
CF2018 => %20
(space)
searchBase=ou%3DdomainWorker%2C%20o%3Ddomain.com
Lucee 5.2.8.50 => %2B
(加号)
searchBase=ou%3DdomainWorker%2C%2Bo%3Ddomain.com