发送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);
}
答案 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代理,您的前端代码可以通过该代理发出请求。