我正在跟踪RegOnline的开发人员页面,以设置对服务器的API调用。它们提供了各种如何握手的示例(PHP、C#、JS、SOAP),最后一个示例提供了如何将API令牌作为方法调用的一部分的最糟糕的示例。
http://developer.regonline.com/authentication-basics/
我试图调用他们的GetEvent方法,这个调用必须包含我生成的API令牌。但是,根据他们的SOAP示例,我只能猜测如何包含令牌的值。他们的例子如下:
<s:complexType name="TokenHeader">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="APIToken" type="s:string"/>
</s:sequence>
<s:anyAttribute/>
</s:complexType>页面上的其他示例都有完整的版本,这些版本显式地显示了如果有必要,可以在哪里对令牌进行硬编码。我承认我目前对SOAP的了解很少,所以在这个例子中我可能遗漏了一些东西。
下面是我调用该方法的尝试。它只显示一页文档和200 OK状态,这是不正确的。
<cfset apiToken = "xxxxx" />
<cfset eventID = "xxxxxx" />
<cfsavecontent variable="soapBody">
<cfoutput>
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<GetEvent xmlns="http://www.regonline.com/api">
<eventID>#eventID#</eventID>
</GetEvent>
</s:Body>
</s:Envelope>
<s:complexType name="TokenHeader">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="APIToken" type="s:string">
#apiToken#
</s:element>
</s:sequence>
<s:anyAttribute/>
</s:complexType>
</cfoutput>
</cfsavecontent>
<cfhttp url="https://www.regonline.com/api" method="get" result="theCFHTTP" redirect="true">
<cfhttpparam type="HEADER" name="Content-Type" value="text/xml; charset=utf-8">
<cfhttpparam type="HEADER" name="Accept" value="application/soap+xml, multipart/related, text/*">
<cfhttpparam type="HEADER" name="User-Agent" value="Axis/1.1">
<cfhttpparam type="HEADER" name="Cache-Control" value="no-cache">
<cfhttpparam type="HEADER" name="Pragma" value="no-cache">
<cfhttpparam type="HEADER" name="SOAPAction" value="https://www.regonline.com/api/default.asmx/GetEvent">
<cfhttpparam type="HEADER" name="Content-Length" value="#len(soapBody)#">
<cfhttpparam type="xml" name="body" value="#soapBody#">
</cfhttp>
<cfdump var="#theCFHTTP#">发布于 2014-04-04 20:16:08
这是你不想做的。使用SOAP调用,只需遵循它们在文档(https://www.regonline.com/api/default.asmx?op=GetEvent)中提供的XML。
因此,在特定情况下,您希望将CSSAVECONTENT变量soapBody替换为下面的内容:
<cfsavecontent variable="soapBody">
<cfoutput>
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<TokenHeader xmlns="http://www.regonline.com/api">
<APIToken>#apiToken#</APIToken>
</TokenHeader>
</soap:Header>
<soap:Body>
<GetEvent xmlns="http://www.regonline.com/api">
<eventID>#eventID#</eventID>
</GetEvent>
</soap:Body>
</soap:Envelope>
</cfoutput>
</cfsavecontent>看看它会给你带来什么。
发布于 2014-04-04 20:13:34
您的SOAP请求格式错误。所有SOAP请求都应该在SOAP信封内。下面是在SoapUI中为getEvent请求创建的模板。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:api="http://www.regonline.com/api">
<soapenv:Header>
<api:TokenHeader>
<!--Optional:-->
<api:APIToken>?</api:APIToken>
</api:TokenHeader>
</soapenv:Header>
<soapenv:Body>
<api:GetEvent>
<api:eventID>?</api:eventID>
</api:GetEvent>
</soapenv:Body>
</soapenv:Envelope>对于电话本身,您可能需要尝试post over get,但我对此不太确定。我认为您可能需要更新的一件事是SOAPAction。在SoapUI中的测试调用中,标头中的操作是http://www.regonline.com/api/GetEvent。不过,这两种方法都可能奏效。
https://stackoverflow.com/questions/22871613
复制相似问题