AJAX 使用 WCF 获取跨域导致解析错误
AJAX get cross-domain with WCF leads to parseerror
我正在尝试使用 $.ajax 从 javascript 使用 WCF Rest 服务,我知道跨域调用存在问题。 google了一天多,已经走了很远,最后一公里没了。
首先,这是我的客户端代码:
$.ajax({
url: "https://myurl-here/api/test?param1=x¶m2=y&callback=?",
type: 'GET',
dataType: 'json',
headers: {
"Authorization": "Basic xxxxxxxxx"
},
success: function(data) {
alert(data);
},
error: function(data, errorThrown) {
alert(errorThrown);
}
});
请注意,我添加了 callback=?
参数并设置了 dataType='json'
。我正在使用 Chrome 调试它,它有一些强大的工具。服务器的响应是 200 OK
。但是,我收到一条错误消息:
Uncaught SyntaxError: Unexpected token :
再谷歌搜索后,我认为这个错误可能是因为服务器响应设置为内容类型 "application/json" 而客户端期望 "application/javascript"。下面是调试工具returns:
如果我单击它并转到响应选项卡,我什至会看到响应中的纯 json 字符串,这是正确的,正是我想要的。
现在我的问题是:我能做什么?有没有办法告诉 ajax 我不希望有脚本,但它应该只获取内容并将其解析为普通内容 json?或者有没有办法忽略解析错误并在之后获取内容? chrome 调试器工具似乎以某种方式掌握了内容。
或者有没有办法完全摆脱这个回调=?我怀疑这会使 contentType 变为 jsonp(我不完全确定这一切是如何工作的)。
我也可以在服务器端更改代码,但是有一些限制:服务器端代码不能托管在 IIS 中,它是一个自托管的 WCF 服务。
你应该尝试使用:
dataType: 'jsonp'
并删除
&callback=?
来自 URL.
更新:
更新
收到响应后 Jquery 尝试验证响应是否包含有效 JSON。如果响应无效 JSON 您将收到解析错误。
- 如果您使用 dataType : 'json' 并且响应包含一个像回调({ /* ... */ })这样的回调,它将失败,因为回调被认为是无效的 JSON。
- 如果您使用 dataType : 'jsonp' jquery 将首先调用回调,然后验证 JSON。
您可以尝试使用像jsonlint.com这样的验证工具来确保返回的JSON是有效的。如果你想阻止 Jquery 验证响应,你可以在服务器端将响应内容类型设置为文本。在客户端,并在 jquery AJAX 调用中使用 contentType : 'text'
。在 success
回调中使用 JavaScript function JSON.parse(text)
将响应文本转换为 JSON。
如果您希望 WCF 服务支持 CORS,您将需要添加 JSONP 支持或 enable CORS。如果您决定启用 CORS,您将需要 Jquery ajax 设置 crossDomain。
希望对您有所帮助!
我正在尝试使用 $.ajax 从 javascript 使用 WCF Rest 服务,我知道跨域调用存在问题。 google了一天多,已经走了很远,最后一公里没了。
首先,这是我的客户端代码:
$.ajax({
url: "https://myurl-here/api/test?param1=x¶m2=y&callback=?",
type: 'GET',
dataType: 'json',
headers: {
"Authorization": "Basic xxxxxxxxx"
},
success: function(data) {
alert(data);
},
error: function(data, errorThrown) {
alert(errorThrown);
}
});
请注意,我添加了 callback=?
参数并设置了 dataType='json'
。我正在使用 Chrome 调试它,它有一些强大的工具。服务器的响应是 200 OK
。但是,我收到一条错误消息:
Uncaught SyntaxError: Unexpected token :
再谷歌搜索后,我认为这个错误可能是因为服务器响应设置为内容类型 "application/json" 而客户端期望 "application/javascript"。下面是调试工具returns:
如果我单击它并转到响应选项卡,我什至会看到响应中的纯 json 字符串,这是正确的,正是我想要的。
现在我的问题是:我能做什么?有没有办法告诉 ajax 我不希望有脚本,但它应该只获取内容并将其解析为普通内容 json?或者有没有办法忽略解析错误并在之后获取内容? chrome 调试器工具似乎以某种方式掌握了内容。
或者有没有办法完全摆脱这个回调=?我怀疑这会使 contentType 变为 jsonp(我不完全确定这一切是如何工作的)。
我也可以在服务器端更改代码,但是有一些限制:服务器端代码不能托管在 IIS 中,它是一个自托管的 WCF 服务。
你应该尝试使用:
dataType: 'jsonp'
并删除
&callback=?
来自 URL.
更新:
更新
收到响应后 Jquery 尝试验证响应是否包含有效 JSON。如果响应无效 JSON 您将收到解析错误。
- 如果您使用 dataType : 'json' 并且响应包含一个像回调({ /* ... */ })这样的回调,它将失败,因为回调被认为是无效的 JSON。
- 如果您使用 dataType : 'jsonp' jquery 将首先调用回调,然后验证 JSON。
您可以尝试使用像jsonlint.com这样的验证工具来确保返回的JSON是有效的。如果你想阻止 Jquery 验证响应,你可以在服务器端将响应内容类型设置为文本。在客户端,并在 jquery AJAX 调用中使用 contentType : 'text'
。在 success
回调中使用 JavaScript function JSON.parse(text)
将响应文本转换为 JSON。
如果您希望 WCF 服务支持 CORS,您将需要添加 JSONP 支持或 enable CORS。如果您决定启用 CORS,您将需要 Jquery ajax 设置 crossDomain。
希望对您有所帮助!