【发布时间】:2015-08-15 10:55:06
【问题描述】:
您好,我正在连接一个 API,该 API 使用第 7 层作为 IP 授权方和 eGalaxy 作为凭据授权方,当发送 curl 请求时,会将一行 xml 发送回给我。我目前正在使用 localhost,我已经实现了 Access-Control-Allow-Origin chrome extension。
我的 curl 请求如下所示:
curl https://client-url/eGalaxy.aspx -H 'Content-Type:text/html' --data '<?xml version:"1.0" encoding="UTF-8"?><Envelope><Header><SourceID>0</SourceID><MessageID>131</MessageID><MessageType>Authenticate</MessageType></Header><Body><Authenticate><Username>*username*</Username><Password>*password*</Password><PasswordEncrypted>NO</PasswordEncrypted></Authenticate></Body></Envelope>' --insecure
当我尝试创建 ajax 请求时,我收到“无效的 HTTP 状态代码 500”错误和“OPTIONS url”,它会下拉显示:
n.ajaxTransport.k.cors.a.crossDomain.send @ jquery-2.1.3.js:4
n.extend.ajax @ jquery-2.1.3.js:4
(anonymous function) @ VM947:2
InjectedScript._evaluateOn @ VM899:895
InjectedScript._evaluateAndWrap @ VM899:828
InjectedScript.evaluate @ VM899:694
我的ajax代码如下:
$.ajax({
url:'https://client-url/eGalaxy.aspx',
data:'<?xml version:"1.0" encoding="UTF-8"?><Envelope><Header>
<SourceID>0</SourceID><MessageID>131</MessageID>
<MessageType>Authenticate</MessageType></Header><Body>
<Authenticate><Username>*username*</Username>
<Password>*password*</Password>
<PasswordEncrypted>NO</PasswordEncrypted></Authenticate></Body>
</Envelope>',
type:'POST',
contentType:'text/xml',
dataType:'xml',
success: function(data){
},
error: function(){
}
});
任何有关翻译成正确 AJAX 请求的帮助将不胜感激!
编辑:如果这有所不同,这些是 curl 完成时与客户端 xml 一起返回的标头(客户端信息已删除)
这个应用程序也将被制作成一个小部件,因此它不会在托管站点之外运行。
更新 1:我正在使用 @KevinB 的建议,即仍未正确添加 CORS 标头。
这是我更新的 JS 代码,复制自 link:
var url = 'https://client-url/eGalaxy.aspx';
var data = '<?xml version="1.0" encoding="UTF-8"?><Envelope><Header><SourceID>1</SourceID><MessageID>131</MessageID><MessageType>Authenticate</MessageType></Header><Body><Authenticate><Username>*username*</Username><Password>*password</Password><PasswordEncrypted>NO</PasswordEncrypted></Authenticate></Body></Envelope>';
var xhr = createCORSRequest('POST', url);
xhr.send(data);
function createCORSRequest(method, url) {
var xhr = new XMLHttpRequest();
if ("withCredentials" in xhr) {
// Check if the XMLHttpRequest object has a "withCredentials" property.
// "withCredentials" only exists on XMLHTTPRequest2 objects.
xhr.open(method, url, true);
} else if (typeof XDomainRequest != "undefined") {
// Otherwise, check if XDomainRequest.
// XDomainRequest only exists in IE, and is IE's way of making CORS requests.
xhr = new XDomainRequest();
xhr.open(method, url);
} else {
// Otherwise, CORS is not supported by the browser.
xhr = null;
}
return xhr;
}
var xhr = createCORSRequest('GET', url);
if (!xhr) {
throw new Error('CORS not supported');
}
在关闭 CORS Chrome 扩展程序运行时,我收到一个 Access-Control-Allow-Origin =! “空”错误。知道 CORS 需要 Access-Control-Allow-Origin 标头来 =! 'null' 是否会在将来将其制成小部件以放入 Content Manager 系统时出现问题?
将它的来源设置为“www.evil.com”,代码中唯一的错误是它说 xhr.send() 是一个匿名方法。使用断点我可以看到 xhr.send() 中的 xhr 设置为空请求:
> XMLHttpRequest {response: "", responseText: ""}
在 createCORSRequest 中,这一行是未定义的。我已经使用“GET”和“POST”作为方法进行了测试。
xhr.open(method, url, true)
编辑 2: 使用@Fabiano 的方法,我已将 web.config 更改为我怀疑是我的服务器的两个版本(?)。我附上我所经历的截图 到目前为止,没有运气。决定使用xhr.AppendHeader: 我决定使用 xhr.setRequestHeader("Access-Control-Allow-Origin", "*"); eGalaxy.aspx 的网络选项卡标题
【问题讨论】:
-
马上,您的
curl请求正在设置Content Type: text/html标头,而您的ajax 请求正在设置Content Type: text/xml标头。也许这两个应该对齐? -
您的 curl 请求是
get请求,不是吗? 500 错误是服务器的问题。我猜你的curl请求没有显示相同的错误,因为它实际上没有向服务器发布任何内容。 -
可能你正面临一个跨域Ajax请求问题。您可以尝试为跨域请求正确设置一些选项。此页面包含相关文档:api.jquery.com/jquery.ajax
-
@Fabiano 那会是什么属性?我在他的代码中没有看到可以使 CORS 请求工作的缺失属性。
-
确保您的服务器已设置为正确响应预检 (OPTIONS) 请求。
标签: javascript jquery ajax google-chrome post