Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过javascript[跨域]获取JSON_Javascript_Jquery_Json - Fatal编程技术网

通过javascript[跨域]获取JSON

通过javascript[跨域]获取JSON,javascript,jquery,json,Javascript,Jquery,Json,请帮助我处理以下情况: 页面p1.aspx只有一个按钮: <button id="btn1" onclick="btnclick();">Button</button> <script type="text/javascript"> $('#btn1').click(function () { $.getJSON("http://localhost/p2.aspx", function (data) { $.each(data,

请帮助我处理以下情况:

页面p1.aspx只有一个按钮:

<button id="btn1" onclick="btnclick();">Button</button>    
<script type="text/javascript">
  $('#btn1').click(function () {
    $.getJSON("http://localhost/p2.aspx", function (data) {
      $.each(data, function (i, field) {            
        alert(field);
      });
    });
  });
</script>
是我希望在javascript代码中读取的值。但这是行不通的

在p2.aspx中,我生成JSON数据如下

Response.Clear();
Response.ContentType = "application/json; charset=utf-8";
Response.Write(jsonString);
Response.End();
在此之后,我无法通过javascript读取json数据。但是如果我把
http://localhost/p2.aspx
通过web浏览器,然后它会在页面上获取json数据。

如果您希望这样做有效,您需要使用

因此,脚本应该考虑
回调
参数:

Response.Clear();
string callback = Request["callback"];
if (!string.IsNullOrEmpty(callback))
{
    Response.ContentType = "application/javascript; charset=utf-8";
    Response.Write(string.Format("{0}({1})", callback, jsonString));
}
else
{
    Response.ContentType = "application/json; charset=utf-8";
    Response.Write(jsonString);
}
Response.End();
然后在客户机上:

$.getJSON("http://localhost/p2.aspx?callback=?", function (data) {
    ...
});
请注意,
回调
查询字符串参数如何设置为
。基本上,jQuery会将其转换为如下所示的请求:

http://localhost/p2.aspx?callback=jQuery123456789....
当然,服务器端脚本应该返回
JSONP
,这是封装在回调名称中的
JSON
字符串:

jQuery123456789....({"code":1})
还要确保代码中使用的
jsonString
变量是实际的JSON字符串(顾名思义)。因为您在问题(
code=1
)中显示的内容远远不是JSON。

如果您想让它起作用,您需要使用它

因此,脚本应该考虑
回调
参数:

Response.Clear();
string callback = Request["callback"];
if (!string.IsNullOrEmpty(callback))
{
    Response.ContentType = "application/javascript; charset=utf-8";
    Response.Write(string.Format("{0}({1})", callback, jsonString));
}
else
{
    Response.ContentType = "application/json; charset=utf-8";
    Response.Write(jsonString);
}
Response.End();
然后在客户机上:

$.getJSON("http://localhost/p2.aspx?callback=?", function (data) {
    ...
});
请注意,
回调
查询字符串参数如何设置为
。基本上,jQuery会将其转换为如下所示的请求:

http://localhost/p2.aspx?callback=jQuery123456789....
当然,服务器端脚本应该返回
JSONP
,这是封装在回调名称中的
JSON
字符串:

jQuery123456789....({"code":1})


还要确保代码中使用的
jsonString
变量是实际的JSON字符串(顾名思义)。因为您在问题中显示的内容(
code=1
)远远不是JSON。

尝试使用相对URL,即just
/p2.aspx
原因是p2.aspx将放在我的服务器上,而p3.aspx和p1.aspx将放在外部服务器上
jsonString
的值是什么?
jsonString
的值是{flag:“1”}只是尝试获取json的简单值object@sancoma:使用
crossDomain
和/或添加
?callback=?
并不能神奇地使其工作。您需要确保服务器支持它。如果您添加了
?callback=?
,那么您正在请求JSONP。这意味着您应该使用回调参数作为函数调用返回一个JavaScript文件(
application/JavaScript
):比如
$\u GET['callback']('.json_encode($data)。');'(我使用PHP,适合您的语言)。或者使用CORS,通过在服务器上设置
Access Control Allow Origin
头()尝试使用相对URL,即just
/p2.aspx
原因是p2.aspx将放在我的服务器上,而p3.aspx和p1.aspx将放在外部服务器上
jsonString
的值是什么?
jsonString
的值是多少{flag:“1”}只是尝试获取json的简单值object@sancoma:使用
crossDomain
和/或添加
?callback=?
并不能神奇地使其工作。您需要确保服务器支持它。如果添加
?callback=?
,则是请求JSONP。这意味着您应该返回一个JavaScript文件(
application/javascript
)使用回调参数作为函数调用:比如
$\u GET['callback']。('.json\u encode($data.);“
(我使用PHP,适应您的语言)。或者通过在服务器上设置
访问控制允许源代码
头来使用CORS()如果您使用的是JSONP,与响应一起发送的正确的
内容类型应该是
application/javascript
。JSONP实际上只是一个javascript文件,附加到您的页面上。您完全正确。我已经更新了我的答案来反映这一点。感谢您指出这一点。没问题。一些浏览器可能已经疯了关于这一点:-P@DarinDimitrov最近我提到过我有多爱你吗?@sancoma,这没关系。不管你做了多少次重定向,如果你想进行跨域AJAX调用,一天结束时你应该返回JSONP,如我的回答所示。如果你使用JSONP,正确的
内容类型
随r一起发送响应应该是
application/javascript
。JSONP实际上只是一个javascript文件,附加到您的页面上。您完全正确。我已经更新了我的答案以反映这一点。感谢您指出这一点。没问题。一些浏览器可能对此感到愤怒:-P@DarinDimitrov我最近有没有提到我有多爱你?@sancoma、 这没关系,不管你做了多少次重定向,如果你想进行跨域AJAX调用,你应该在一天结束时返回JSONP,如我的回答所示。