【问题标题】:Javascript Get JSON data from Url via jqueryJavascript 通过 jquery 从 Url 获取 JSON 数据
【发布时间】:2016-11-02 11:36:15
【问题描述】:

我有以下设置:
两个本地域 192.168.30.1 -> 带有 JSON 数据的 Web 服务器和 169.254.168.105:3000,我想在其中处理数据。

网络服务器通过 php 显示数据,您必须经过身份验证才能查看数据。所以网址看起来像这样:“http://192.168.30.1/rest/activity14?auth_username=username&auth_password=password
如果我在浏览器中输入,则会得到以下输出:

{
    people: [
        {
            id: "58107d10ad910",
            name: "name"
        }
    ],
    documents: [
        {
            document_id: "5811f9b306216",
            name: "document1"
        }
    ]
}

我需要在另一个域上使用它。所以我尝试通过 jQuery ajax 获取数据,但似乎无论如何我都无法得到它。我尝试了以下 ajax 调用:

$.ajax({
    type: "GET",
    url: $url,
    dataType: 'json',
    success: function(data) {
        console.log("success" );
    },
    error: function(e) {
        console.log("Error: " + e);
    }
});  

这会导致控制台出错(“错误:[object Object]”)。

所以我尝试了不同的方法。我试过getJSON:

$.getJSON( $url, function(data) {
    console.log("success");
}).error(function(e) {
    console.log(e);
});

它甚至没有给出错误消息。

我还阅读了有关 jsonp 并将其用于跨域 json 调用的信息。下面的做法

function logResults(json) {
    console.log("json" + json);
}

$.ajax({
    url: $url + "callback=logResults?",
    dataType: "jsonp",
    jsonpCallback: "logResults",
    error: function(e) {
        console.log("Error: " + e);
    }
});

这也不起作用。在 deloper 工具网络选项卡中,我发现以下有关 jsonp 调用的信息(状态:已取消):

General:
Request URL:http://192.168.30.1/rest/activity14?    auth_username=kusername&auth_password=password&callback=logResults?&callback=logResults&_=1478083606031

Request Headers:
Provisional headers are shown
Referer:http://169.254.168.105:3000/
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36

Query String Parameters:
auth_username:username
auth_password:password
callback:logResults?
callback:logResults
_:1478083606031

我无法真正解释这一点,但也许它有助于找到我的问题。

对于我的具体情况,正确的方法是什么?如果我已经走在正确的道路上,我到底做错了什么?

编辑:
这是正常 JSON 请求(不是 jsonp 请求)在 DevTools 网络选项卡中的输出:

General:
Request URL:https://rippleapi.herokuapp.com/xhr_proxy?tinyhippos_apikey=ABC&tinyhippos_rurl=http%3A//192.168.33.10/rest/activity14%3Fauth_username%3Dusername%26auth_password%3Dpassword

Request Headers:
Provisional headers are shown
Access-Control-Request-Headers:x-ripple-user-agent
Access-Control-Request-Method:GET
Origin:http://169.254.168.105:3000
Referer:http://169.254.168.105:3000/
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36

Query String Parameters:
tinyhippos_apikey:ABC
tinyhippos_rurl:http://192.168.33.10/rest/activity14?auth_username=username&auth_password=password

【问题讨论】:

  • getJSON 版本不会出错,因为 error 的承诺版本是fail 方法,而不是error。另外,尝试console.log e 本身,而不是将其连接到"Error: "。我的意思是像console.log("Error", e) 这样的东西会这样做。然后您可以在控制台中检查错误对象并更好地了解发生了什么。
  • @kk_,您说当您使用AJAX 的第一种方法时,您会得到Error: [object Object]。这意味着您的响应继续错误回调。那么很可能意味着服务器端代码有问题。
  • @ZoltánTamási 我更改了错误 console.log 并且输出是“Object {readyState: 0, responseText: "", status: 0, statusText: "error"}" 这并没有真正的帮助对吗?
  • @ZoltánTamási 你的意思是我应该在浏览器中使用“运行 PHP 脚本”输入 url 吗?我这样做了,输出是我在问题中发布的 JSON 返回。
  • 哦,我明白了,谢谢,没意识到。你检查$url变量是否正确?

标签: javascript jquery json ajax


【解决方案1】:

您正在查询的端点应该返回编码对象而不是解析对象。如果您使用的是 PHP,请尝试json_encode()

【讨论】:

  • 所以事先我没有编写发送 JSON 数据的 PHP 控制器(不过我可以更改它)。但就我所见,这已经发生了。 Zend 框架正在使用和一个方法“$this->sendJson(['people' => $people, 'documents' => $documents]);”叫做。并且据我所见,这部分与 json_encode() 相同(framework.zend.com/manual/1.12/en/… 引用:“用法很简单:要么将其称为 helper broker 的方法,要么调用其中一个方法 encodeJson() 或 sendJson( )")
  • 1.我复制了您的浏览器输出并在其上运行了 JSON.stringify() 函数。结果与您列出的不同:{"people":[{"id":"58107d10ad910","name":"name"}],"documents":[{"document_id":"5811f9b306216","name":"document1"}]} 。 2.当您记录console.log('error' + e)时,最好记录console.log('error', e) - 逗号而不是加号,否则错误获取转换为字符串[对象对象]而不是显示实际对象。也许这会给我们更多关于实际错误的信息。也可以在浏览器中看到请求响应,在JS之前
  • To 1.) 抱歉,我没有提到我的输出是由 chrome 插件修改的(“JSON 视图”——我不知道它会改变语法)。我禁用它并得到与您现在发布的完全相同的输出: {"people":[{"id":"58107d10ad910","name":"name"}],"documents":[{"document_id":"5811f9b306216 ","name":"document1"}]} 为 2。)我昨天早些时候更改了它,这是对象的输出:"Object {readyState: 0, responseText: "", status: 0, statusText: "error "}" - 但我认为这也无济于事
猜你喜欢
  • 2018-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-24
  • 2015-10-24
  • 2017-11-10
  • 2013-05-29
相关资源
最近更新 更多