jQuery AJAX SOAP Request返回405

时间:2016-05-07 09:27:06

标签: jquery ajax soap

我正在尝试使用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,但没有多大帮助。

谢谢!

1 个答案:

答案 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请求,您需要:

  • 让您的后端充当电话的代理人。然后,您可以在同一个域上托管JavaScript客户端并对您的代理进行调用(如果您的代理将SOAP响应转换为更简单的API,则甚至不需要成为SOAP调用);
  • 与实施Web服务的人交谈并要求他们修复CORS标头。
祝你好运!