SOAP请求的问题。 “访问控制允许来源”

时间:2017-06-09 14:35:48

标签: javascript xml http cors xmlhttprequest

发送SOAP请求时遇到问题。我已经研究了这个主题,并在这里和其他地方看到了很多关于这个主题的帖子,但没有任何对我有用或真正解决我遇到的问题。为了更具体地说明我正在尝试做什么,我正在尝试访问BrightSign网络上的API。文档的链接是here。我已经尝试通过html页面上的javascript函数运行我的请求,但没有运气。我每次都会收到“no'Access-Control-Allow-Origin'”错误。我已经安装了一个附加组件,我看到它是一个绕过这个的修复程序,虽然我没有得到Access-Control-Allow-Origin错误,但我收到了200个代码错误。我最大的问题是我已经下载了SoapUI并通过那里运行了请求。这样做的时候,我收到了预期的回复!我已经尝试将原始XML从SoapUI复制并粘贴到我的测试页面中但没有用。我每次都得到同样的错误。对此的任何帮助将不胜感激。

谢谢

以下是我正在使用的网页代码:

function soap(){
            var xmlhttp = new XMLHttpRequest();
            xmlhttp.open('POST', 'https://api.brightsignnetwork.com/2014/12/SOAP/Basic/', true);

            // build SOAP request
            var sr =
                '<soapenv:Envelope xmlns:soap="https://api.brightsignnetwork.com/2014/12/SOAP/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">' +
                    '<soapenv:Header>' +
                        '<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">' +
                            '<wsse:UsernameToken wsu:Id="UsernameToken-541861B587A894A0A714970165483407">' +
                                '<wsse:Username></wsse:Username>' +
                                '<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"></wsse:Password>' +
                                '<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">tlWiCWeD9E8JEaY00RfAhA==</wsse:Nonce>' +
                                '<wsu:Created>2017-06-09T13:55:48.340Z</wsu:Created>' +
                            '</wsse:UsernameToken>' +
                        '</wsse:Security>' +
                    '</soapenv:Header>' +
                    '<soapenv:Body>' +
                        '<soap:GetDynamicPlaylistByName>' +
                            '<soap:name></soap:name>' +
                            '<soap:loadContent></soap:loadContent>' +
                        '</soap:GetDynamicPlaylistByName>' +
                    '</soapenv:Body>' +
                '</soapenv:Envelope>';

        xmlhttp.onreadystatechange = function () {
            if (xmlhttp.readyState == 4) {
                if (xmlhttp.status == 200) {
                    alert('REQUEST SENT. CHECK FOR RESPONSE.');
                }
            }
        }

        // Send the POST request
        xmlhttp.setRequestHeader('Content-Type', 'text/xml');
        xmlhttp.setRequestHeader('Authentication-Type', 'Preemptive');
        xmlhttp.send(sr);
        }

1 个答案:

答案 0 :(得分:2)

http://docs.brightsign.biz/display/DOC/BSN+API处的BrightSign网络API文档未表明该API旨在用于在浏览器中运行的前端JavaScript代码。

鉴于此,它们似乎没有在其API端点的响应中包含Access-Control-Allow-Origin响应标头,因此您的浏览器不允许您的前端JavaScript代码访问响应。

https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS解释了这里发生了什么,但其中的要点是浏览器确实按预期获得了响应 - 如果你查看浏览器devtools的网络选项卡,你可以检查那里的响应。

但仅仅因为浏览器有响应并不意味着它会将响应暴露给您的前端JavaScript代码。如果响应包含Access-Control-Allow-Origin响应标头,浏览器将仅将来自跨源请求的响应公开给前端代码。

由于BrightSign网络API不会发送该响应标头,因此您无法直接从前端代码处理该API,而是需要从后端代码发出请求或设置某种代理并通过它提出请求。

"No 'Access-Control-Allow-Origin' header is present on the requested resource"的答案说明了如何设置一个特殊的CORS代理,您的前端代码可以通过该代理发出请求。