3

Dictionary.com 完全没有提供有关如何从中获取数据的文档。我正在尝试使用 jQuery 的 ajax 请求,但这些都不起作用。

他们提供了一个我应该能够使用的 URL。我将在下面提供。

http://api-pub.dictionary.com/v001?vid=<VID>&type=random&site=dictionary

他们还提供了一把钥匙,我假设我把它放在了<VID>现场。

有人可以告诉我我做错了什么吗?我将在下面提供我正在使用的代码:

$("#btnGetData").click(function() {

  $.ajax({
    url: "http://api-pub.dictionary.com/",
    type: "GET",
    data: "v001?vid=<VID>&type=random&site=dictionary",
    success: function() { alert("success") },
  });

});

有人可以告诉我我做错了什么吗?

4

2 回答 2

4

您没有正确传递数据。请求网址也是http://api-pub.dictionary.com/v001. 尝试这个:

$("#btnGetData").click(function() {
  $.ajax({
    url: "http://api-pub.dictionary.com/v001",
    type: "GET",
    dataType: "jsonp",  //For external apis
    data: {"vid": <VID>,
          "type":"random"
          "site": "dictionary"},
    success: function() { 
       alert("success") },
  });
});

更新:也许您被与@thordarson note 相同的来源策略dataType: "jsonp"阻止,在这种情况下添加:到您的 ajax 调用。

于 2013-02-02T05:56:29.537 回答
3

可能性 1

您无权访问他们的 API。根据他们的API 页面,他们对授予谁访问其 API 的权限非常有选择性。

我们对我们的 API 合作伙伴有选择性,并根据具体情况批准使用以及制定条款。如果您有兴趣使用我们的 API,请直接与我们联系 [...]。

可能性 2

您被同源策略阻止。浏览器通常对 JavaScript 跨不同域发出的请求非常严格。这可以使用跨域资源共享绕过。这需要配置您请求的服务器,因此在这种情况下它是不可行的。

最好的办法是创建一个请求 URL 的服务器端脚本,然后使用 AJAX 请求文件。

PHP中的示例,我们称之为request_dictionary.php

<?php

    $vid = "Your API key";
    $type = $_GET['type'];
    $site = $_GET['dictionary'];

    $request_url = "http://api-pub.dictionary.com/v001?vid=$vid&type=$type&site=$site";

    echo file_get_contents($request_url);

?>

注意:您可能需要更改它以满足您的需要(错误处理、404、缓存等)。此代码未经测试。

然后更改您的 jQuery 以便它请求您的文件。

$("#btnGetData").click(function() {

  $.ajax({
    url: "/request_dictionary.php",
    type: "GET",
    data: "type=random&site=dictionary",
    success: function() { alert("success") },
  });

});

警告

在没有代理的情况下使用 AJAX 调用(如可能性 2中所述)将暴露您的 API 密钥。这违反了Dictionary.com 的 API 服务条款

2.1 Dictionary.com 将为您的客户应用程序分配和交付应用程序密钥以访问 API。所有呼叫都必须包含此类应用程序密钥。应用程序密钥与每个客户应用程序及其所有版本、升级和更新唯一关联。应用程序密钥是这些条款和条件中定义的机密信息。您必须以任何第三方无法访问的安全、嵌入式方式维护和保存应用程序密钥。Dictionary.com 可以随时完全撤销应用程序密钥。Dictionary.com 可能会阻止尝试使用无效或已撤销的应用程序密钥访问 API。

我已经更新了可能性 2中的代码,通过将 API 密钥保存在 PHP 文件中来隐藏它。


更新/注意:仅传递dataType: 'jsonp'以启用跨域调用是不够的。响应服务器需要使用Access-Control-Allow-Origin包含您的域(或包含您的域的规则)的标头进行响应。作为请求者,您无法控制任何此类配置。

更新/注 2:在调查您的请求 URL 中返回的标头后,我看不到Access-Control-Allow-Origin. 这意味着即使您可以访问他们的 API,也无法使用 AJAX 访问它。完整标题如下:

GET /v001?vid=%3CVID%3E&type=random&site=dictionary HTTP/1.1[CRLF]
Host:            api-pub.dictionary.com[CRLF]
Connection:      close[CRLF]
User-Agent:      Web-sniffer/1.0.44 (+http://web-sniffer.net/)[CRLF]
Accept-Encoding: gzip[CRLF]
Accept:          text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8[CRLF]
Accept-Language: en-US,en;q=0.8[CRLF]
Accept-Charset:  ISO-8859-1,UTF-8;q=0.7,*;q=0.7[CRLF]
Cache-Control:   no-cache[CRLF]
Referer:         http://web-sniffer.net/[CRLF]
于 2013-02-02T05:39:35.753 回答