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

| 我正在使用jQuery的
$.getJSON()
函数来返回简短的JSON数据集。 我已经将JSON数据放在了诸如
example.com
这样的网址上。 我没有意识到,但是当我访问相同的URL时,无法加载JSON数据。我浏览了控制台,发现
XMLHttpRequest
无法加载
XMLHttpRequest
。 现在,我已经通读了很多站点,据说它们使用了“ 0”,这可以解决,但显然没有用。我应该在标题或函数中更改某些内容吗? 非常感谢您的帮助。     
已邀请:
        很简单,使用
$.getJSON()
函数,并且在您的网址中仅包含   回调=? 作为参数。这样会将调用转换为进行跨域调用所必需的JSONP。更多信息:http://api.jquery.com/jQuery.getJSON/     
        您可能希望改用JSON-P(请参见下文)。首先简单说明一下。 您提到的标头来自跨源资源共享标准。请注意,人们实际使用的某些浏览器不支持它,而在其他浏览器(Microsoft,叹息)上,它要求使用特殊的对象(
XDomainRequest
)而不是jQuery使用的标准
XMLHttpRequest
。它还要求您更改服务器端资源以显式允许其他来源(
www.xxxx.com
)。 要获取您请求的JSON数据,您基本上可以使用以下三种选择: 如果可能的话,可以通过更正要加载的文件的位置来最大程度地兼容,以使它们与要加载的文件具有相同的来源。 (我假设您必须通过Ajax加载它们,因此出现了同源起源策略问题。) 使用不受SOP约束的JSON-P。 jQuery在
ajax
调用中对此提供了内置支持(只需将
dataType
设置为\“ jsonp \”,jQuery就会完成所有客户端工作)。这需要服务器端更改,但不是很大。基本上,无论您拥有什么生成JSON响应的内容,都只会查找名为\“ callback \”的查询字符串参数,并将JSON包装在将调用该函数的JavaScript代码中。例如,如果您当前的JSON响应为:
{\"weather\": \"Dreary start but soon brightening into a fine summer day.\"}
您的脚本将查找\“ callback \”查询字符串参数(假设该参数的值为\“ jsop123 \”),然后将该JSON包装在JavaScript函数调用的语法中:
jsonp123({\"weather\": \"Dreary start but soon brightening into a fine summer day.\"});
而已。 JSON-P具有广泛的兼容性(因为它可以通过JavaScript
script
标签工作)。 JSON-P仅适用于
GET
,而不适用于
POST
(再次是因为它通过
script
标记起作用)。 使用CORS(与您引用的标头相关的机制)。上面链接的规范中的详细信息,但基本上是: 答:浏览器将使用
OPTIONS
HTTP动词(方法)向您的服务器发送\“ preflight \”消息。它将包含将与
GET
或ѭ15send发送的各种标头,以及标头\“ Origin \”,\“ Access-Control-Request-Method \”(例如,
GET
POST
)和\“ Access-Control -Request-Headers \“(它要发送的标题)。 B.您的PHP根据该信息确定请求是否正常,如果可以,则使用\“ Access-Control-Allow-Origin \”,\“ Access-Control-Allow-Methods \”和\“ Access”响应-Control-Allow-Headers \“标头及其允许的值。您不会随该响应发送任何正文(页面)。 C.浏览器将查看您的回复,并查看是否允许向您发送实际的
GET
POST
。如果是这样,它将再次发送该请求,并带有“ Origin”和各种“ Access-Control-Request-xyz”标头。 D.您的PHP再次检查这些标头,以确保它们仍然可以使用,如果可以,则响应请求。 用伪代码(我没有做太多的PHP,所以我不在这里尝试做PHP语法):
// Find out what the request is asking for
corsOrigin = get_request_header(\"Origin\")
corsMethod = get_request_header(\"Access-Control-Request-Method\")
corsHeaders = get_request_header(\"Access-Control-Request-Headers\")
if corsOrigin is null or \"null\" {
    // Requests from a `file://` path seem to come through without an
    // origin or with \"null\" (literally) as the origin.
    // In my case, for testing, I wanted to allow those and so I output
    // \"*\", but you may want to go another way.
    corsOrigin = \"*\"
}

// Decide whether to accept that request with those headers
// If so:

// Respond with headers saying what\'s allowed (here we\'re just echoing what they
// asked for, except we may be using \"*\" [all] instead of the actual origin for
// the \"Access-Control-Allow-Origin\" one)
set_response_header(\"Access-Control-Allow-Origin\", corsOrigin)
set_response_header(\"Access-Control-Allow-Methods\", corsMethod)
set_response_header(\"Access-Control-Allow-Headers\", corsHeaders)
if the HTTP request method is \"OPTIONS\" {
    // Done, no body in response to OPTIONS
    stop
}
// Process the GET or POST here; output the body of the response
再次强调这是伪代码。     

要回复问题请先登录注册