JSON适用于一个地址但不适用于另一个地址

时间:2014-02-28 02:24:09

标签: javascript html json getjson

所以我是一个完整的新手,我正在试图弄清楚如何正确使用json。基本上我问为什么下面代码中的第一个按钮将检索并显示json,而第二个和第三个按钮不会。在浏览器中访问时,所有链接都以我能告诉的相同格式显示,所以我看不出问题所在。

http://jsfiddle.net/5QM82/4/

<html>
<head> 
    <script type="text/javascript" charset="utf-8" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>  
    <script>
        function doJSON1() {
            $.getJSON('http://time.jsontest.com/?alloworigin=true', function (data) {
                alert(JSON.stringify(data))
            });
        }
        function doJSON2() {
            $.getJSON('http://api.vircurex.com/api/get_info_for_1_currency.json?base=DOGE&alt=BTC', function (data) {
                alert(JSON.stringify(data))
            });
        }
        function doJSON3() {
            $.getJSON('http://pubapi.cryptsy.com/api.php?method=singleorderdata&marketid=132', function (data) {
                alert(JSON.stringify(data))
            });
        }
</script> 
</head>
<body>         
    <h3>Get JSON1</h3>
    <button onclick="doJSON1()">Get JSON</button>
    <h3>Get JSON2</h3>
    <button onclick="doJSON2()">Get JSON</button>
    <h3>Get JSON3</h3>
    <button onclick="doJSON3()">Get JSON</button>
</body>
</html>    

3 个答案:

答案 0 :(得分:2)

当javascript不起作用时检查控制台(大多数浏览器为F12),第二个和第三个链接分别抛出错误,如下所示:

XMLHttpRequest cannot load http://api.vircurex.com/api/get_info_for_1_currency.json?base=DOGE&alt=BTC. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://fiddle.jshell.net' is therefore not allowed access.
XMLHttpRequest cannot load http://pubapi.cryptsy.com/api.php?method=singleorderdata&marketid=132. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://fiddle.jshell.net' is therefore not allowed access. 

关于这意味着什么以及如何解决它,另一个stackoverflow答案可能比我更好地解释了它,以及所有精彩的链接资源

No Access Controlled Origin

最终,如果托管资源的服务器(即您请求的文件)没有响应足够的标头(Access-Control-Allow-Origin就是其中之一),那么您将无法访问资源另一个域名

您确定第二个和第三个不是JSONP API(即您将它们包含为<script>标记而不是Ajax获取),只需通过读取它看起来好像它们应该是api的URL ,但可能不符合CORS,因此JSONP。

答案 1 :(得分:1)

这是一个跨域问题。大多数浏览器不允许跨域请求来阻止XSS攻击等。有标题允许此权限。

这可能是一个有用的资源:https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS

答案 2 :(得分:0)

我发现第二个链接搞砸了,确实让第三个链接起作用我做了以下事情:

1-将主要代码更改为:http://jsfiddle.net/5QM82/6/

<html>
<head> 
    <script type="text/javascript" charset="utf-8" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>  
    <script>
        function doJSON1() {
            $.getJSON('http://time.jsontest.com/?alloworigin=true', function (data) {
                alert(JSON.stringify(data))
            });
        }
        function doJSON2() {
        $.ajax({          
            type:  'GET',
            url:   '/php.php',
            dataType: 'JSON',              
            success: function(data){
                alert(JSON.stringify(data));
            }
         });
        }
        function doJSON3() {
            $.getJSON('http://pubapi.cryptsy.com/api.php?method=singleorderdata&marketid=132', function (data) {
                alert(JSON.stringify(data))
            });
        }
</script> 
</head>
<body>         
    <h3>Get JSON1</h3>
    <button onclick="doJSON1()">Get JSON</button>
    <h3>Get JSON2</h3>
    <button onclick="doJSON2()">Get JSON</button>
    <h3>Get JSON3</h3>
    <button onclick="doJSON3()">Get JSON</button>
</body>
</html>    

2-添加了这个php文件以绕过“No Access Controlled Origin”:

<?php
header('Content-type: application/xml');
echo file_get_contents("http://pubapi.cryptsy.com/api.php?method=singleorderdata&marketid=132");
?>