我正在尝试使用jQuery AJAX执行SOAP请求,该请求在使用SOAP客户端时有效。使用jQuery实现总是返回
'XMLHttpRequest无法加载https://api.mindbodyonline.com/0_5/ClassService.asmx?op=GetClasses。预检的响应具有无效的HTTP状态代码405'
我发现的所有解决方案都谈到了在服务端更改某些内容(我正在查询的端点)。但是,我是API的消费者,我无法影响它,因为我说它在使用SOAP客户端时有效。
以下是来自SOAP客户端(Boomerang)的请求:
POST https://api.mindbodyonline.com/0_5/ClassService.asmx HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: http://clients.mindbodyonline.com/api/0_5/GetClasses
<x:Envelope xmlns:x="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://clients.mindbodyonline.com/api/0_5">
<x:Header/>
<x:Body>
<ns:GetClasses>
<ns:Request>
<ns:SourceCredentials>
<ns:SourceName>##PLACEHOLDER##</ns:SourceName>
<ns:Password>##PLACEHOLDER##</ns:Password>
<ns:SiteIDs>
<ns:int>-99</ns:int>
</ns:SiteIDs>
</ns:SourceCredentials>
<ns:XMLDetail>Bare</ns:XMLDetail>
<ns:PageSize>0</ns:PageSize>
<ns:CurrentPageIndex>0</ns:CurrentPageIndex>
</ns:Request>
</ns:GetClasses>
</x:Body>
这是我对此调用的jQuery实现:
var webServiceURL = 'https://api.mindbodyonline.com/0_5/ClassService.asmx?op=GetClasses';
var soapMessage = '<x:Envelope xmlns:x="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://clients.mindbodyonline.com/api/0_5"> <x:Header/> <x:Body> <ns:GetClasses> <ns:Request> <ns:SourceCredentials> <ns:SourceName>##PLACEHOLDER##</ns:SourceName> <ns:Password>##PLACEHOLDER##</ns:Password> <ns:SiteIDs> <ns:int>-99</ns:int> </ns:SiteIDs> </ns:SourceCredentials> <ns:XMLDetail>Bare</ns:XMLDetail> <ns:PageSize>0</ns:PageSize> <ns:CurrentPageIndex>0</ns:CurrentPageIndex> </ns:Request> </ns:GetClasses> </x:Body> </x:Envelope>';
function CallService()
{
$.ajax({
url: webServiceURL,
type: "POST",
dataType: "xml",
data: soapMessage,
contentType: "text/xml; charset=\"utf-8\"",
success: OnSuccess,
error: OnError
});
return false;
}
function OnSuccess(data, status)
{
alert(data.d);
}
function OnError(request, status, error)
{
alert('error');
}
有什么想法我错了吗?对于WebServiceURL,我也使用了https://api.mindbodyonline.com/0_5/ClassService.asmx,但没有多大帮助。
谢谢!
答案 0 :(得分:1)
您必须在此端点发布消息:
git gc
你也可以向你的Ajax调用添加<select class="selectpicker" data-container="#wrap">
...
</select>
(在这种情况下我认为这是默认的,但它使意图更明确)。
然后,服务应该通过设置正确的CORS headers来允许呼叫。如果服务器不是,那么由于the same origin policy,您无法通过JavaScript进行调用。
你也有可能没有正确地打电话。
只是为了确保CORS是问题,(只是为了测试)你可以turn off the same origin policy in Chrome看看你是否可以从JavaScript调用服务。一旦您通过JavaScript成功调用,请重新打开安全性并重新进行测试。如果失败,则Web服务未正确配置为允许CORS请求,您需要: