【问题标题】:Using ColdFusion to parse WSDL/SOAP使用 ColdFusion 解析 WSDL/SOAP
【发布时间】:2019-08-24 09:35:50
【问题描述】:

我将 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”和“mail”的详细信息。我在这里想念什么?我怀疑这可能与我直接访问 URL(登录用户)有关,因为请求是从服务器发出的并且没有“经过身份验证”。如果是这种情况,我该如何解决?

【问题讨论】:

  • 如你所说,可能是身份验证。如果您在私人窗口中尝试它是否有效?也可能是 url 参数编码的问题,或者浏览器发送的不同标头。使用浏览器的 Web 控制台查看成功请求所发送的内容。此外,对于笑容,请尝试将 + 替换为空格。
  • 当我用 [空格] 替换 + 时,空格被 URL 编码为 %20 并返回相同的结果(良好的结果)。
  • 抱歉,对于最后一部分,我的意思是在 cfhttp 调用中将 + 更改为空格。剩下的就是在您的浏览器中调查的内容(使用私人标签,查看 Web 控制台标题、url 参数等)。即找出浏览器调用的不同之处以及它成功的原因。
  • 如果你把你的评论放在那里,我的意思是去掉+,我可以把它标记为答案。 :) 我能够解析 XML 树并获得我需要的数据。
  • 我假设您的意思是名为“mail”的属性?如果响应只有一个具有该名称的属性,则相对搜索应该可以工作xmlSearch(doc, "//dsml:attr[@name='mail']")。如果没有,最好打开一个新线程,以便下一个人更容易找到 xml 问题。

标签: web-services soap coldfusion lucee


【解决方案1】:

更新:

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

查看成功的响应,我注意到它在"o" (organization Name) 之前不包含+

<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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多