我正在使用jQuery的$.getJSON()
函数来返回一组简短的JSON数据。
我已将JSON数据放在example.com
等网址上。
我没有意识到,但是当我访问相同的URL时,无法加载JSON数据。我按照控制台进行操作,发现XMLHttpRequest
无法加载Access-Control-Allow-Origin
。
现在,我已经通读了很多网站,只是说要使用$.getJSON()
,这将是解决方法,但显然它不起作用。我是否应该在标题或函数中更改某些内容?
非常感谢帮助。
答案 0 :(得分:73)
很简单,使用$.getJSON()
功能,在您的网址中只包含
回调=?
作为参数。这会将调用转换为进行跨域调用所必需的JSONP。更多信息:http://api.jquery.com/jQuery.getJSON/
答案 1 :(得分:38)
你可能想要使用JSON-P(见下文)。首先快速解释一下。
您提到的标题来自Cross Origin Resource Sharing标准。请注意人们实际使用的某些浏览器是not supported,而在其他浏览器(Microsoft的,叹息)上,它需要使用特殊对象(XDomainRequest
)而不是标准{ jQuery使用的{1}}。它还要求您更改服务器端资源以明确允许其他来源(XMLHttpRequest
)。
要获取您要求的JSON数据,您基本上有三个选项:
如果可能,您可以通过更正正在加载的文件的位置来实现最大兼容性,这样它们与您加载的文档具有相同的来源。 (我假设您必须通过Ajax加载它们,因此出现Same Origin Policy问题。)
使用不受SOP约束的JSON-P。 jQuery在www.xxxx.com
调用中内置了对它的支持(只需将ajax
设置为“jsonp”,jQuery将完成所有客户端工作)。这需要服务器端更改,但不是很大;基本上你生成JSON响应的只是查找一个名为“callback”的查询字符串参数,并将JSON包装在可以调用该函数的JavaScript代码中。例如,如果您当前的JSON响应是:
dataType
您的脚本将查找“回调”查询字符串参数(假设参数的值为“jsop123”)并将JSON包装在JavaScript函数调用的语法中:
{"weather": "Dreary start but soon brightening into a fine summer day."}
就是这样。 JSON-P 非常广泛兼容(因为它通过JavaScript jsonp123({"weather": "Dreary start but soon brightening into a fine summer day."});
标签工作)。 JSON-P仅适用于script
,而不是GET
(再次因为它通过POST
标签工作)。
使用CORS(与您引用的标题相关的机制)。 the specification linked above中的详细信息,但基本上是:
一个。浏览器将使用script
HTTP谓词(方法)向您的服务器发送“预检”消息。它将包含它将使用OPTIONS
或GET
以及标题“Origin”,“Access-Control-Request-Method”(例如POST
或{ {1}})和“Access-Control-Request-Headers”(它想要发送的标题)。
B中。您的PHP根据该信息决定请求是否正常,如果是,则响应“Access-Control-Allow-Origin”,“Access-Control-Allow-Methods”和“Access-Control-Allow-Headers”标题包含它允许的值。您不会发送任何带有该响应的正文(页面)。
℃。浏览器会查看您的回复,看看是否允许向您发送实际的GET
或POST
。如果是这样,它将再次使用“Origin”和各种“Access-Control-Request-xyz”标头发送该请求。
d。您的PHP会再次检查这些标题,以确保它们仍然正常,如果是,则会响应请求。
在伪 - 代码中(我没有做太多PHP,所以我不打算在这里做PHP语法):
GET
再次强调这是伪代码。