使用ColdFusion来解析WSDL / SOAP

web-services soap coldfusion lucee

36 观看

1回复

1265 作者的声誉

我将USERID传递给我认为是SOAP请求的东西。我从来没有使用过SOAP,也不太确定从哪里开始,所以如果我的问题没有意义,请告诉我,我会尝试填写缺少的细节。

问题的上下文:我正在转换一个excel宏(宏将查询将用户ID传递给服务器,服务器将返回员工详细信息,如姓名,电子邮件,地址等)并转换为Web查找。

我有以下代码:

<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”和“邮件”细节。我在这里错过了什么?我怀疑它可能与ME直接访问URL(登录用户)有关,因为请求是从服务器发出的,而不是“经过身份验证”。如果是这种情况,我该如何解决?

作者: HPWD 的来源 发布者: 2019 年 8 月 22 日

回应 1


1

3605 作者的声誉

决定

更新:

(最初,我对为什么我无法用CF2018重现你的结果感到有些困惑,但现在我知道你使用的是Lucee,差异是有道理的。)

查看成功的响应,我注意到它+“o”(组织名称)之前不包含a :

<dsml:entry dn="domainssouid=xxxx,ou=domainWorker, o=domain.com">

这意味着VBA调用将其+视为空间的编码,但CFHTTP将其编码为文字加号,导致错误,因为它破坏了LDAP查询:

[LDAP:错误代码34 - 无效的DN],名称无效 - ou = domainWorker,+ o = domain.com

解决方案是摆脱加号+并用空格替换它:

searchBase=ou=domainWorker, o=domain.com

有趣的是,转储http请求数据显示CF2018显然做了不同的事情。与Lucee不同,CF2018将加号视为空格。

CF2018 => %20(空格)

searchBase=ou%3DdomainWorker%2C%20o%3Ddomain.com

Lucee 5.2.8.50 => %2B(加号)

searchBase=ou%3DdomainWorker%2C%2Bo%3Ddomain.com
作者: Ageax 发布者: 2019 年 8 月 22 日
32x32