jQuery.getJSON - Access-Control-Allow-Origin问题

时间:2011-06-18 14:19:11

标签: javascript jquery json xmlhttprequest access-control

我正在使用jQuery的$.getJSON()函数来返回一组简短的JSON数据。

我已将JSON数据放在example.com等网址上。 我没有意识到,但是当我访问相同的URL时,无法加载JSON数据。我按照控制台进行操作,发现XMLHttpRequest无法加载Access-Control-Allow-Origin

现在,我已经通读了很多网站,只是说要使用$.getJSON(),这将是解决方法,但显然它不起作用。我是否应该在标题或函数中更改某些内容?

非常感谢帮助。

2 个答案:

答案 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数据,您基本上有三个选项:

  1. 如果可能,您可以通过更正正在加载的文件的位置来实现最大兼容性,这样它们与您加载的文档具有相同的来源。 (我假设您必须通过Ajax加载它们,因此出现Same Origin Policy问题。)

  2. 使用不受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标签工作)。

  3. 使用CORS(与您引用的标题相关的机制)。 the specification linked above中的详细信息,但基本上是:

    一个。浏览器将使用script HTTP谓词(方法)向您的服务器发送“预检”消息。它将包含它将使用OPTIONSGET以及标题“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”标题包含它允许的值。您不会发送任何带有该响应的正文(页面)。

    ℃。浏览器会查看您的回复,看看是否允许向您发送实际的GETPOST。如果是这样,它将再次使用“Origin”和各种“Access-Control-Request-xyz”标头发送该请求。

    d。您的PHP会再次检查这些标题,以确保它们仍然正常,如果是,则会响应请求。

    - 代码中(我没有做太多PHP,所以我不打算在这里做PHP语法):

    GET

    再次强调这是伪代码。