首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将带有SOAP主体的CFHTTP请求转换为CFINVOKE请求

如何将带有SOAP主体的CFHTTP请求转换为CFINVOKE请求
EN

Stack Overflow用户
提问于 2019-07-18 20:39:16
回答 1查看 380关注 0票数 0

我有一个ColdFusion 11站点,需要使用SOAP请求与支付处理器进行通信。我已经让它在CFHTTP请求中很好地工作了,但是返回值(在SOAP消息中传递)有点难以使用。

为了寻找更好的东西,我遇到了CFINVOKE和webservice属性。我似乎正确地调用了webservice方法,但我认为我传递给服务的数据格式不正确。

这是正在工作的SOAP/CFHTTP请求(“.”)。(取代敏感的实施细节):

代码语言:javascript
复制
<!--- build SOAP data --->
<cfsavecontent variable="soapBody">
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
        <s:Body>
            <PreparePaymentv2 xmlns="https://common.checkout.cdc.nicusa.com">
                <request xmlns:a="http://schemas.datacontract.org/2004/07/Common.Payment.Common" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                    <a:STATECD>...</a:STATECD>
                    <a:HASHVALUE i:nil="true"/>
                    <a:AMOUNT i:nil="true"/>
                    <a:CID i:nil="true"/>
                    <a:SERVICECODE>...</a:SERVICECODE>
                    <a:UNIQUETRANSID>...</a:UNIQUETRANSID>
                    <a:DESCRIPTION>...</a:DESCRIPTION>
                    <a:LOCALREFID>...</a:LOCALREFID>
                    <a:MERCHANTID>...</a:MERCHANTID>
                    <a:MERCHANTKEY>...</a:MERCHANTKEY>
                    <a:PAYTYPE i:nil="true"/>
                    <a:NAME>...</a:NAME>
                    <a:COMPANYNAME i:nil="true"/>
                    <a:COUNTRY>...</a:COUNTRY>
                    <a:FAX i:nil="true"/>
                    <a:ADDRESS1 >...</a:ADDRESS1>
                    <a:ADDRESS2 i:nil="true"/>
                    <a:CITY>...</a:CITY>
                    <a:STATE>...</a:STATE>
                    <a:ZIP>...</a:ZIP>
                    <a:PHONE>...</a:PHONE>
                    <a:EMAIL>...</a:EMAIL>
                    <a:EMAIL1 i:nil="true"/>
                    <a:EMAIL2 i:nil="true"/>
                    <a:EMAIL3 i:nil="true"/>
                    <a:HREFSUCCESS>...</a:HREFSUCCESS>
                    <a:HREFFAILURE>...</a:HREFFAILURE>
                    <a:HREFDUPLICATE>...</a:HREFDUPLICATE>
                    <a:HREFCANCEL>...</a:HREFCANCEL>
                    <a:ORDERATTRIBUTES i:nil="true"/>
                    <a:LINEITEMS>
                        <a:LINEITEM>
                            <a:ITEM_ID>...</a:ITEM_ID
                            <a:SKU>...</a:SKU>
                            <a:DESCRIPTION>...</a:DESCRIPTION>
                            <a:UNIT_PRICE>...</a:UNIT_PRICE>
                            <a:QUANTITY>....</a:QUANTITY>
                            <a:ATTRIBUTES/>
                        </a:LINEITEM>
                    </a:LINEITEMS>
                    <a:ALTNAME i:nil="true"/>
                    <a:ALTADDRESS1 i:nil="true"/>
                    <a:ALTADDRESS2 i:nil="true"/>
                    <a:ALTCITY i:nil="true"/>
                    <a:ALTSTATE i:nil="true"/>
                    <a:ALTZIP i:nil="true"/>
                    <a:ALTCOUNTRY i:nil="true"/>
                </request>
            </PreparePaymentv2>
        </s:Body>
    </s:Envelope>
</cfsavecontent>

<!--- submit info to SOAP endpoint --->
<cfhttp url="https://stageccp.dev.cdc.nicusa.com/CommonCheckout/CCPWebService/ServiceWeb.svc" method="post" result="httpResponse">
    <cfhttpparam type="header" name="content-type" value="text/xml">
    <cfhttpparam type="header" name="SOAPAction" value="https://common.checkout.cdc.nicusa.com/IServiceWeb/PreparePaymentv2">
    <cfhttpparam type="header" name="content-length" value="#len(soapBody)#">
    <cfhttpparam type="header" name="charset" value="utf-8">
    <cfhttpparam type="header" name="Accept-Encoding" value="*">
    <cfhttpparam type="Header" name="TE" value="deflate;q=0">
    <cfhttpparam type="xml" value="#soapBody#">
</cfhttp>

这是我正在努力工作的CreateObject / CFINVOKE请求:

代码语言:javascript
复制
<cfscript>
    nullValue = "";
    args = {
        STATECD = ...,
        HASHVALUE = nullValue,
        AMOUNT = nullValue,
        CID = nullValue,
        SERVICECODE = ...,
        UNIQUETRANSID = ...,
        DESCRIPTION = ...,
        LOCALREFID = ...,
        MERCHANTID = ...,
        MERCHANTKEY = ...,
        PAYTYPE = nullValue,
        NAME = ...,
        COMPANYNAME = nullValue,
        COUNTRY = ...,
        FAX = nullValue,
        ADDRESS1 = ...,
        ADDRESS2 = ...,
        CITY = ...,
        STATE = ...,
        ZIP = ...,
        PHONE = ...,
        EMAIL = ...,
        EMAIL1 = nullValue,
        EMAIL2 = nullValue,
        EMAIL3 = nullValue,
        HREFSUCCESS = ...,
        HREFFAILURE = ...,
        HREFDUPLICATE = ...,
        HREFCANCEL = ...,
        ORDERATTRIBUTES = nullValue,
        LINEITEMS = [
            {
                ITEM_ID = ...,
                SKU = ...,
                DESCRIPTION = ...,
                UNIT_PRICE = ...,
                QUANTITY = ...,
                ATTRIBUTES = nullValue
            }
        ],
        ALTNAME = nullValue,
        ALTADDRESS1 = nullValue,
        ALTADDRESS2 = nullValue,
        ALTCITY = nullValue,
        ALTSTATE = nullValue,
        ALTZIP = nullValue,
        ALTCOUNTRY = nullValue
    };

    ws = CreateObject("webservice","https://stageccp.dev.cdc.nicusa.com/CCPWebService/ServiceWeb.wsdl");
    ws.PreparePaymentv2(args);
    response = getSOAPResponse(ws);
</cfscript>

<cfinvoke webservice="https://stageccp.dev.cdc.nicusa.com/CCPWebService/ServiceWeb.wsdl" method="PreparePaymentv2" request="#args#" returnvariable="response">

这两种策略都返回错误消息:

代码语言:javascript
复制
Cannot perform web service invocation PreparePaymentv2.

查看详细信息将显示一个扩展堆栈跟踪,我的推理是来自远程服务器,其中包含了在跟踪顶部附近的消息:

代码语言:javascript
复制
 Object reference not set to an instance of an object.

编辑:完整的错误细节如下:

代码语言:javascript
复制
The fault returned when invoking the web service operation is: org.apache.axis2.AxisFault: Object reference not set to an instance of an object. at org.apache.axis2.util.Utils.getInboundFaultFromMessageContext(Utils.java:531
 at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:375
 at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421
 at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229
 at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165
 at com.nicusa.cdc.checkout.common.ServiceWebStub.preparePaymentv2(ServiceWebStub.java:217
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source
 at java.lang.reflect.Method.invoke(Unknown Source
 at coldfusion.xml.rpc.Axis2ServiceProxy.getResult(Axis2ServiceProxy.java:112
 at coldfusion.xml.rpc.ServiceProxy.invokeImpl(ServiceProx... 

以及完整的堆栈跟踪:

代码语言:javascript
复制
coldfusion.xml.rpc.ServiceProxy$ServiceInvocationException: Cannot perform web service invocation PreparePaymentv2. at coldfusion.xml.rpc.Axis2ServiceProxy.getResult(Axis2ServiceProxy.java:122
 at coldfusion.xml.rpc.ServiceProxy.invokeImpl(ServiceProxy.java:469
 at coldfusion.xml.rpc.ServiceProxy.invoke(ServiceProxy.java:413
 at coldfusion.runtime.CfJspPage._invoke(CfJspPage.java:2489
 at cfpayport_redirect2ek2648755446._factor4(C:\websites\preceptorStudent\test\payport_redirect.k2:312
 at cfpayport_redirect2ek2648755446._factor5(C:\websites\preceptorStudent\test\payport_redirect.k2:120
 at cfpayport_redirect2ek2648755446.runPage(C:\websites\preceptorStudent\test\payport_redirect.k2:1
 at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:247
 at coldfusion.tagext.lang.IncludeTag.handlePageInvoke(IncludeTag.java:736
 at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:572
 at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65
 at coldfusion.filter.IpFilter.invoke(IpFilter.java:45
 at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:474
 at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:42
 at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40
 at coldfusion.filter.PathFilter.invoke(PathFilter.java:153
 at coldfusion.filter.LicenseFilter.invoke(LicenseFilter.java:30
 at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:94
 at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28
 at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38
 at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:58
 at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38
 at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22
 at coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62
 at coldfusion.filter.RequestThrottleFilter.invoke(RequestThrottleFilter.java:151
 at coldfusion.CfmServlet.service(CfmServlet.java:219
 at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208
 at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42
 at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110
 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:458
 at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:196
 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:637
 at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316
 at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source
 at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61
 at java.lang.Thread.run(Unknown Source)

我最好的猜测是,这与传入的数据有关。我还尝试从设置为nullValue的args中省略任何参数。这将导致相同的错误消息。我意识到对nullValue使用空字符串不是最优的;我还没有为ColdFusion 11找到更好的替代方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-31 18:21:31

返回值(在SOAP消息中传递)使用起来有点困难。

你有什么特别的问题吗?通常,您只需将响应解析为XML,并使用结构表示法访问所需的节点:

代码语言:javascript
复制
<cfset root = xmlParse(httpResponse.fileContent)>
<cfdump var="#root#" label="HttpResponse">
<cfoutput>FaultCode = #root.Envelope.Body.Fault.FaultCode.xmlText#</cfoutput>

通常,这比使用createObject("webservice")更容易。您已经遇到了最大的问题,即解决web服务错误可能是一个痛苦的过程;-)。错误消息往往是模糊的,最常见的是“找不到参数{...some params.}的Web服务操作.”。信息不多。它只说明论点有问题,但没有提供任何关于哪个论点、什么错误或如何修正它的线索。

当然,你通常可以让事情运转起来..。最终。但是,如果它是一个复杂的web服务,这并不总是值得花费时间和精力,这就是为什么经常建议使用cfhttp。

查看详细信息将显示一个扩展堆栈跟踪,我的理由是来自远程服务器,其中包含以下消息,位于跟踪顶部:Cannot perform web service invocation PreparePaymentv2.

无论如何,如果您仍然想尝试cfinvoke,那么这些参数至少有三个问题:

  1. 并非所有的元素都是字符串。因此,使用nullValue = ""会在空字符串不能转换为正确的type时导致错误。这就是ORDERATTRIBUTES所发生的事情。由于它是可选的,如果您不想为该键传递一个值,只需从args结构中完全忽略它。
  2. LINEITEMS不是数组。它是一个包含一个名为"lineitem“的键的结构,它是一个数组。所以这个值应该是这样构造的: LINEITEMS.LINEITEM ={。线项数据.}
  3. ORDERATTRIBUTES也是如此。它是一个包含一个名为"field“的键的结构,它是一个结构数组: ORDERATTRIBUTES.FIELD = {...field数据…}

如果您想了解更多关于web服务如何内部工作的知识,CF的功能是基于的,它使用一个名为wsdl2java的工具将WSDL转换成java类。您可以通过保存和查看它生成的文件来了解如何构造参数。所以我才弄明白了上面的问题。保存的文件将位于cfusion/stubs子目录中。

代码语言:javascript
复制
 // Only need to do this once. DON'T use in Prod as it's very time consuming
 ws = CreateObject("webservice","https://example.com/ServiceWeb.wsdl"
     , {saveJava=true, refreshWSDL=true});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57102342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档