XMLHttpRequest无法使用jQuery加载URL
我试图从一个“远程”网站获取一些JSON数据。 我在99000端口上运行我的Web服务,然后在99001端口上启动我的网站(http:// localhost:99001 / index.html)。
我收到以下消息:
XMLHttpRequest cannot load http://localhost:99000/Services.svc/ReturnPersons. Origin http://localhost:99001 is not allowed by Access-Control-Allow-Origin.
即使如我启动我的网页作为一个HTML文件,我得到这个:
XMLHttpRequest cannot load http://localhost:99000/Services.svc/ReturnPersons.Origin null is not allowed by Access-Control-Allow-Origin.
Web服务返回数据。 我试图捕捉这样的数据项:
var url = "http://localhost:99000/Services.svc/ReturnPersons"; $.getJSON(url, function (data) { success: readData(data) }); function readData(data) { alert(data[0].FirstName); }
我试图得到这个结构:
[{"FirstName":"Foo","LastName":"Bar"},{"Hello":"Foo","LastName":"World"}]
你知道为什么我得到这个错误吗?
你不能做一个XMLHttpRequest跨域,唯一的“选项”将是一种叫做JSONP的技术,它归结为:
要开始请求:添加一个新的<script>
标记与远程URL,然后确保远程URL返回一个有效的JavaScript文件,调用您的callback函数。 一些服务支持这个(并且让你在GET参数中命名你的callback)。
另一个简单的方法是,在本地服务器上创build一个“代理”,该代理获取远程请求,然后将其“转发”回到您的javascript。
编辑/添加:
我看到jQuery已经内置了对JSONP的支持,通过检查URL是否包含“callback =?” (jQuery将用实际的callback方法replace?)。 但是,您仍然需要在远程服务器上处理该消息以生成有效的响应。
在新的jQuery 1.5中,您可以使用:
$.ajax({ type: "GET", url: "http://localhost:99000/Services.svc/ReturnPersons", dataType: "jsonp", success: readData(data), error: function (xhr, ajaxOptions, thrownError) { alert(xhr.status); alert(thrownError); } })
摆弄3个工作解决scheme 。
给定一个外部的JSON:
myurl = 'http://wikidata.org/w/api.php?action=wbgetentities&sites=frwiki&titles=France&languages=zh-hans|zh-hant|fr&props=sitelinks|labels|aliases|descriptions&format=json'
解决scheme1:$ .ajax()+ jsonp:
$.ajax({ dataType: "jsonp", url: myurl , }).done(function ( data ) { // do my stuff });
解决scheme2:$ .ajax()+ json +&calback = ?:
$.ajax({ dataType: "json", url: myurl + '&callback=?', }).done(function ( data ) { // do my stuff });
解决scheme3:$ .getJSON()+ calback = ?:
$.getJSON( myurl + '&callback=?', function(data) { // do my stuff });
文档: http : //api.jquery.com/jQuery.ajax/,http : //api.jquery.com/jQuery.getJSON/
find一个可能的解决办法,我不相信被提及。
这是一个很好的问题描述: http : //www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api
基本上只要你使用表单/url编码/纯文本内容types,你很好。
$.ajax({ type: "POST", headers: { 'Accept': 'application/json', 'Content-Type': 'text/plain' }, dataType: "json", url: "http://localhost/endpoint", data: JSON.stringify({'DataToPost': 123}), success: function (data) { alert(JSON.stringify(data)); } });
我用它与ASP.NET WebAPI2。 所以在另一端:
public static void RegisterWebApi(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Formatters.Clear(); config.Formatters.Add(new JsonMediaTypeFormatter()); config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain")); }
这样Json格式化程序在parsing纯文本内容types时得到了使用。
在Web.config中不要忘记:
<system.webServer> <httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Methods" value="GET, POST" /> </customHeaders> </httpProtocol>
希望这可以帮助。
我正在使用WebAPI 3并面临同样的问题。 这个问题已经解决了@Rytis增加了他的解决scheme。 我想在WebAPI 3中,我们不需要定义RegisterWebApi
方法。
我的更改只在web.config文件中,并正在工作。
<httpProtocol> <customHeaders> <add name="Access-Control-Allow-Origin" value="*" /> <add name="Access-Control-Allow-Methods" value="GET, POST" /> </customHeaders> </httpProtocol>
感谢您的解决scheme@Rytis!