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