通过javascript获取JSON [跨域]

时间:2013-07-31 19:07:22

标签: 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, function (i, field) {            
        alert(field);
      });
    });
  });
</script>

以上是我想通过javascript获取JSON文本的方式。

Web应用程序http://localhost/p2.aspx被重定向到内部的http://localhost/p3.aspx。页面http://localhost/p3.aspx再次被重定向回 http://localhost/p2.aspx?code=1

code=1

是我想在我的javascript代码中读取的值。但它不起作用。

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

Response.Clear();
Response.ContentType = "application/json; charset=utf-8";
Response.Write(jsonString);
Response.End();

在此之后我无法通过javascript读取json数据。但是,如果我只是通过网络浏览器放置http://localhost/p2.aspx,那么它会在页面上获取json数据。

1 个答案:

答案 0 :(得分:3)

如果您希望这样做,则需要使用JSONP

因此,您的脚本应考虑callback参数:

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) {
    ...
});

注意callback查询字符串参数如何设置为?。基本上jQuery会将此转换为如下所示的请求:

http://localhost/p2.aspx?callback=jQuery123456789....

并且您的服务器端脚本当然应该返回JSONP,这是包含在回调名称中的JSON字符串:

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

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