如何在Coldfusion中创建complexType变量以用于SOAP请求参数? 更新

如何在Coldfusion中创建complexType变量以用于SOAP请求参数? 更新,soap,coldfusion,arcgis,Soap,Coldfusion,Arcgis,在进一步阅读文档之后,我注意到我遗漏了FieldArray和PropertyArray键。因此,我不再得到类型不匹配错误,但SOAP请求仍然不正确 这是错误信息 The fault returned when invoking the web service operation is: AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}client faultSubcode: faultString: Error pr

在进一步阅读文档之后,我注意到我遗漏了FieldArray和PropertyArray键。因此,我不再得到类型不匹配错误,但SOAP请求仍然不正确

这是错误信息

The fault returned when invoking the web service operation is:
AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}client faultSubcode: faultString: Error processing server request faultActor: faultNode: faultDetail: {http://xml.apache.org/axis/}stackTrace:Error processing server request at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:221) at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:128) at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087) at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source) at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source) at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source) at org.apache.... ''
这是修订后的代码

<cfscript>
function newField(Name, Type, IsNullable, Length, Precision, Scale) {
    s=StructNew();
    s["Name"]=arguments.Name;
    s["Type"]=arguments.Type;
    s["IsNullable"]=arguments.IsNullable;
    s["Length"]=arguments.Length;
    s["Precision"]=arguments.Precision;
    s["Scale"]=arguments.Scale;
    return s;
}

function newRecord(oid, zipcode) {
    a=ArrayNew(1);
    ArrayAppend(a, arguments.oid);
    ArrayAppend(a, arguments.zipcode);
    return a;
}

function newKeyValue(key, value) {
    s=StructNew();
    s["Key"]=arguments.key;
    s["Value"]=arguments.value;
    return s;
}
</cfscript>


<cftry>

<cfscript>
ws = CreateObject("webservice", "http://tasks.arcgisonline.com/ArcGIS/services/Locators/TA_Address_NA_10/GeocodeServer?wsdl");
recordset=StructNew();
</cfscript>

<h1>GeocodeAddresses</h1>
<cfscript>
fields=StructNew();
fields["FieldArray"]=ArrayNew(1);
ArrayAppend(fields.FieldArray, newField("oid", "esriFieldTypeOID", false, 10, 0, 0));
ArrayAppend(fields.FieldArray, newField("zipcode", "esriFieldTypeString", true, 10, 0, 0));
recordset["Fields"]=fields;

records=ArrayNew(1);
ArrayAppend(records, newRecord(1,"33607"));
ArrayAppend(records, newRecord(2,"90210"));
recordset["Records"]=records;


mappings=StructNew();
mappings["PropertyArray"]=ArrayNew(1);
ArrayAppend(mappings.PropertyArray, newKeyValue("oid", "oid"));
ArrayAppend(mappings.PropertyArray, newKeyValue("Zip", "zipcode"));

propertys=StructNew();
propertys["PropertyArray"]=ArrayNew(1);
</cfscript>

<cfscript>
result = ws.geocodeAddresses(AddressTable=recordSet, AddressFieldMapping=mappings, PropMods=JavaCast("null", ""));
</cfscript>

<cfdump var="#ws#" label="#GetCurrentTemplatePath()#" />

<cfcatch>
    <cfdump var="#cfcatch#" label="#GetCurrentTemplatePath()#" />
    <cfdump var="#GetSOAPRequest(ws)#" label="#GetCurrentTemplatePath()#" />
    <cfdump var="#GetSOAPResponse(ws)#" label="#GetCurrentTemplatePath()#" />
</cfcatch>
</cftry>
这是WSDL链接

以下是有关该服务的一些文档

下面是我试图用的代码

<cfscript>
function newField(Name, Type, IsNullable, Length, Precision, Scale) {
    s=StructNew();
    i=0;
    for(i in arguments){
        s[i]=arguments[i];
    }
    return s;
}

function newRecord(oid, zipcode) {
    a=ArrayNew(1);
    ArrayAppend(a, arguments.oid);
    ArrayAppend(a, arguments.zipcode);
    return a;
}

function newKeyValue(key, value) {
    s=StructNew();
    s["Key"]=arguments.key;
    s["Value"]=arguments.value;
    return s;
}
</cfscript>


<cftry>

<cfscript>
ws = CreateObject("webservice", "http://tasks.arcgisonline.com/ArcGIS/services/Locators/TA_Address_NA_10/GeocodeServer?wsdl");
recordset=StructNew();
</cfscript>
<cfdump var="#ws#" label="#GetCurrentTemplatePath()#" />

<h1>GeocodeAddresses</h1>
<cfscript>
fields=ArrayNew(1);
ArrayAppend(fields, newField("zipcode", "esriFieldTypeString", true, 10, 0, 0));
ArrayAppend(fields, newField("oid", "esriFieldTypeOID", false, 10, 0, 0));
recordset["Fields"]=fields;

records=ArrayNew(1);
ArrayAppend(records, newRecord(1,"90210"));
recordset["Records"]=records;


mappings=ArrayNew(1);
ArrayAppend(mappings, newKeyValue("zipcode", "Zip"));
</cfscript>

<cfdump var="#recordSet#" label="#GetCurrentTemplatePath()#" />
<cfdump var="#mappings#" label="#GetCurrentTemplatePath()#" />

<cfscript>
result = ws.geocodeAddresses(recordSet, mappings, JavaCast("null", ""));
</cfscript>

<cfdump var="#ws#" label="#GetCurrentTemplatePath()#" />

<cfcatch>
    <cfdump var="#cfcatch#" label="#GetCurrentTemplatePath()#" />
</cfcatch>
</cftry>

函数newField(名称、类型、IsNullable、长度、精度、比例){
s=StructNew();
i=0;
for(i在参数中){
s[i]=参数[i];
}
返回s;
}
函数newRecord(oid、zipcode){
a=ArrayNew(1);
ArrayAppend(a,arguments.oid);
ArrayAppend(a,arguments.zipcode);
返回a;
}
函数newKeyValue(键,值){
s=StructNew();
s[“Key”]=arguments.Key;
s[“Value”]=arguments.Value;
返回s;
}
ws=CreateObject(“webservice”http://tasks.arcgisonline.com/ArcGIS/services/Locators/TA_Address_NA_10/GeocodeServer?wsdl");
记录集=StructNew();
地理编码地址
字段=ArrayNew(1);
ArrayAppend(字段,newField(“zipcode”,“esrifeldTypeString”,true,10,0,0));
ArrayAppend(字段,新字段(“oid”,“ESRIFELDTYPEOID”,false,10,0,0));
记录集[“字段”]=字段;
记录=ArrayNew(1);
ArrayaAppend(记录,新记录(1,“90210”));
记录集[“记录”]=记录;
映射=ArrayNew(1);
ArrayAppend(映射,newKeyValue(“zipcode”,“Zip”));
结果=ws.geocodeAddresses(记录集、映射、JavaCast(“null”)、“”);

您需要使用CFC镜像复杂数据类型,请参阅:


您需要使用CFC镜像复杂数据类型,请参阅:


这是一个非常好的开始使用Coldfusion消费复杂数据类型的地方。它们可能非常棘手,因为您可能需要一个数组、一个结构数组或一个简单的结构,具体取决于WSDL项

(不要因为它是旧的而丢弃它-该信息仍然与CF9事件相关)

通常,如果有多个项,则需要创建一个数组,否则它是一个结构。我发现您需要为结构使用str['key'],而不是str.key或str={key=value},因为区分大小写只在第一个约定中保持


根据我的经验,这需要大量的尝试和错误,特别是如果您将几个项目传递到请求中

这是一个非常好的开始使用Coldfusion消费复杂数据类型的地方。它们可能非常棘手,因为您可能需要一个数组、一个结构数组或一个简单的结构,具体取决于WSDL项

(不要因为它是旧的而丢弃它-该信息仍然与CF9事件相关)

通常,如果有多个项,则需要创建一个数组,否则它是一个结构。我发现您需要为结构使用str['key'],而不是str.key或str={key=value},因为区分大小写只在第一个约定中保持


根据我的经验,这需要大量的尝试和错误,特别是如果您将几个项目传递到请求中

这似乎是关于使用CFC为您自己的web服务定义复杂类型。这也适用于调用web服务吗?看起来我必须试一试。看起来不匹配。使用参数{[(Component=com.esri.www.schemas.ArcGIS._10_0.recordset)],[(Component=com.esri.www.schemas.ArcGIS._10_0.PropertySet)],[(Component=com.esri.www.schemas.ArcGIS._10_0.PropertySet)]对错误Web服务操作GeoCodeAddress进行标记找不到。也许您可以联系@ShirakAvakian。我想我可能只需要用Java创建这些类。这似乎是关于使用CFC为您自己的web服务定义复杂类型。这也适用于调用web服务吗?看起来我必须试一试。看起来不匹配。使用参数{[(Component=com.esri.www.schemas.ArcGIS._10_0.recordset)],[(Component=com.esri.www.schemas.ArcGIS._10_0.PropertySet)],[(Component=com.esri.www.schemas.ArcGIS._10_0.PropertySet)]对错误Web服务操作GeoCodeAddress进行标记找不到。也许你可以联系@ShirakAvakian我想我可能只需要用Java创建这些类。这似乎很相关,尽管我不太明白如何应用它,但我已经编辑了这个问题。任何一行的更改都可以让我更好地理解它吗?不幸的是,我没有时间深入研究,但是您可能想尝试一个结构数组而不是数组的结构,所以在查看“fields”变量时,请尝试fields=[{}]。另外,我会抓取soapui并使用它来帮助理解请求应该是什么样子。我发现它是一个非常宝贵的工具。这似乎是相关的,虽然我不太明白如何应用它,但我已经编辑了这个问题。任何一行的更改都可以让我更好地理解它吗?不幸的是,我没有时间深入研究,但是您可能想尝试一个结构数组而不是数组的结构,所以在查看“fields”变量时,请尝试fields=[{}]。另外,我会抓取soapui并使用它来帮助理解请求应该是什么样子。我发现它是一个无价的工具。
java.lang.IllegalArgumentException: argument type mismatch
<cfscript>
function newField(Name, Type, IsNullable, Length, Precision, Scale) {
    s=StructNew();
    i=0;
    for(i in arguments){
        s[i]=arguments[i];
    }
    return s;
}

function newRecord(oid, zipcode) {
    a=ArrayNew(1);
    ArrayAppend(a, arguments.oid);
    ArrayAppend(a, arguments.zipcode);
    return a;
}

function newKeyValue(key, value) {
    s=StructNew();
    s["Key"]=arguments.key;
    s["Value"]=arguments.value;
    return s;
}
</cfscript>


<cftry>

<cfscript>
ws = CreateObject("webservice", "http://tasks.arcgisonline.com/ArcGIS/services/Locators/TA_Address_NA_10/GeocodeServer?wsdl");
recordset=StructNew();
</cfscript>
<cfdump var="#ws#" label="#GetCurrentTemplatePath()#" />

<h1>GeocodeAddresses</h1>
<cfscript>
fields=ArrayNew(1);
ArrayAppend(fields, newField("zipcode", "esriFieldTypeString", true, 10, 0, 0));
ArrayAppend(fields, newField("oid", "esriFieldTypeOID", false, 10, 0, 0));
recordset["Fields"]=fields;

records=ArrayNew(1);
ArrayAppend(records, newRecord(1,"90210"));
recordset["Records"]=records;


mappings=ArrayNew(1);
ArrayAppend(mappings, newKeyValue("zipcode", "Zip"));
</cfscript>

<cfdump var="#recordSet#" label="#GetCurrentTemplatePath()#" />
<cfdump var="#mappings#" label="#GetCurrentTemplatePath()#" />

<cfscript>
result = ws.geocodeAddresses(recordSet, mappings, JavaCast("null", ""));
</cfscript>

<cfdump var="#ws#" label="#GetCurrentTemplatePath()#" />

<cfcatch>
    <cfdump var="#cfcatch#" label="#GetCurrentTemplatePath()#" />
</cfcatch>
</cftry>