jQuery: getJSON +请求 SunlightLabs API 帮助

发布于 2024-10-24 23:01:30 字数 779 浏览 3 评论 0原文

我在使用 jQuery 的 getJSON 函数从 API 调用中提取特定元素时遇到问题。我正在尝试使用 SunlightLab 的 国会 API 来提取有关立法者的具体信息。在下面的示例中,我尝试提取立法者的网站:

$.getJSON("http://services.sunlightlabs.com/api/legislators.get.json?apikey=[api key]&lastname=Weiner&jsonp=?" ,  function(data) {

    alert("hello from sunlight");
    alert(data.response.legislator.website);

}); 

使用上面的代码,第一个警报出现,但第二个警报甚至没有出现。我知道 getJSON 在这种情况下应该使用 JSONP,并且我认为我的设置正确,以“&jsonp=?”结束我的 URL。

将 getJSON 函数中的 URL 放入 Web 浏览器中会得到以下结果:

?({"响应": {"立法者": {“网站”: “http://weiner.house.gov/”,“传真”: “202-226-7253”,...等

我对“?”感到有点困惑。显示在本文开头,但如果显示第一个警报,则请求一定成功......

I'm having trouble pulling a specific element from an API call using jQuery's getJSON function. I'm trying to use SunlightLab's congress API to pull specific info about legislators. In the example below I'm trying to pull a legislator's website:

$.getJSON("http://services.sunlightlabs.com/api/legislators.get.json?apikey=[api key]&lastname=Weiner&jsonp=?" ,  function(data) {

    alert("hello from sunlight");
    alert(data.response.legislator.website);

}); 

Using the above code, the first alert shows up but the second alert does not even occur. I understand that getJSON should be using JSONP in this instance, and I think I have that set up correctly, ending my URL with '&jsonp=?'.

Putting the URL in my getJSON function into a web browser gives me this:

?({"response": {"legislator":
{"website":
"http://weiner.house.gov/", "fax":
"202-226-7253", ... etc.

I'm a little thrown by the '?' showing up at the beginning of this, but if the first alert is showing up then the request must be succeeding...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

雨轻弹 2024-10-31 23:01:30

您使用的 URL 将 JSONP 回调设置为等于 ?,这意味着它使用 JavaScript 对象的参数注入一个名为 ? 的 JavaScript 函数。这是无效的。因此,请求成功,但您定义的包装函数没有被调用(并且无效)。

您可以更改 URL,使其 jsonp=callback (或其他处理函数名称),然后定义一个名为 callback 的函数来处理需要该对象的参数。

在 jQuery 中(自动)触发 JSONP 支持的一种方法是将键切换为“回调”,以便它向 jQuery 发出信号,表明您正在执行 JSONP 调用。即,callback=callback

编辑:正如 Drackir 指出的,jQuery 在 $ 中提供了一个设置。 ajax 让它定义自己的回调函数名称,但您需要通过在 中设置 dataType: 'jsonp' 来向它表明它是一个 JSONP 调用$.ajax 调用。

The URL you're using is setting the JSONP callback to be equal to ?, which means its injecting a JavaScript function called ? with an argument of a JavaScript object. This is invalid. So, the request is succeeding, but the wrapper function you've defined isn't being called (and isn't valid).

You could change the URL so that its jsonp=callback (or some other handler function name), and then define a function called callback that handles an argument that expects the object.

One way to (automatically) trigger JSONP support in jQuery is to switch the key to be called 'callback' so that it signals to jQuery that you're doing a JSONP call. ie, callback=callback.

EDIT: As Drackir points out, jQuery provides a setting in $.ajax for letting it define it's own callback function name, but you need to signal to it that its a JSONP call by setting dataType: 'jsonp' in the $.ajax call.

无声静候 2024-10-31 23:01:30

出现问号是因为您将 JSONP 回调函数指定为 ?在您的查询字符串中(即 &jsonp=?)。出于安全考虑(特别是同源策略),您无法向站点发出 AJAX 请求与您所在页面位于同一域之外。为了解决这个问题,JSONP 通过创建一个脚本标签来工作,并将 SRC 设置为其他站点上脚本的 URL。这将加载外部 JavaScript 文件并运行其中的任何代码。现在,为了将该外部代码与 JavaScript 链接起来,外部 API 需要调用函数的名称 (&jsonp=functionnametocall)。返回的 JavaScript 调用该函数并传入它尝试以 JSON 对象形式返回的数据作为第一个参数。

因此,当您去那里时看到问号的原因是因为您将问号传递给 jsonp 查询字符串参数。 jQuery 会自动将 http://www.test.com/api/apikey=292929&callback=? 等 url 中的问号转换为唯一命名的函数。这是由 jQuery 在后台处理的,因此您不必考虑它。

现在,我不知道 jQuery 是否检测到回调参数的名称是否为 callback=? 以外的名称。 $.getJSON() 然而,它是较长的简短形式:

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

我建议您尝试直接使用 $.ajax() 并设置 jsonp设置等于“jsonp”。这告诉 $.ajax() 方法查询字符串参数称为 jsonp 而不是 callback。本质上是这样的:

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback,
  jsonp:"jsonp"
});

更多信息: $.getJSON | $.ajax()

The question mark is there because you specified the JSONP callback function to be ? in your query string (ie. &jsonp=?). Due to security concerns (specifically the same-origin policy) you cannot do an AJAX request to a site outside the same domain as the page you're on. To get around this, JSONP works by creating a script tag, with the SRC set to the URL of the script on the other site. This will load the external JavaScript file and run whatever code is there. Now, in order to link that external code with your JavaScript, the external API takes the name of a function to call (&jsonp=functionnametocall). The returned JavaScript calls that function and passes in the data it's trying to return as a JSON object as the first argument.

So, the reason you see the question mark when you go there is because you're passing a question mark to the jsonp query string parameter. jQuery will automatically convert the question mark in a url such as http://www.test.com/api/apikey=292929&callback=? to a uniquely named function. This is handled in the background by jQuery so you don't have to think about it.

Now, that said, I don't know if jQuery detects if the name of the callback parameter as being something other than callback=?. $.getJSON() however is a short form for the longer:

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

I suggest you try using $.ajax() directly and set the jsonp setting equal to "jsonp". This tells the $.ajax() method that the query string parameter is called jsonp and not callback. So like this essentially:

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback,
  jsonp:"jsonp"
});

More information: $.getJSON | $.ajax()

耳根太软 2024-10-31 23:01:30

好吧,好吧,这是一个相当简单的修复,在@Drackir 给出的示例中添加一行。缺少的部分是 ajax 设置中的“cache: true”。最终的工作代码如下所示:

$.ajax({
         url: 'http://services.sunlightlabs.com/api/legislators.get.json?apikey=[api key]7&lastname=Weiner',
         dataType: 'jsonp',
         cache: true,
         jsonp: 'jsonp',
         success: function(data) {
             alert("hello from ajax") ;
             alert(data.response.legislator.website);
         }

    });

我不确定为什么在这种情况下需要“cache: true”。感谢您的帮助。

OK, OK, so it was a rather simple fix, adding a line to the the example given by @Drackir. The missing piece was 'cache: true' within the ajax settings. The final working code looked like this:

$.ajax({
         url: 'http://services.sunlightlabs.com/api/legislators.get.json?apikey=[api key]7&lastname=Weiner',
         dataType: 'jsonp',
         cache: true,
         jsonp: 'jsonp',
         success: function(data) {
             alert("hello from ajax") ;
             alert(data.response.legislator.website);
         }

    });

I'm not sure why 'cache: true' is needed in this case. Thanks for the help.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文