如何使用jQuery向Dictionary.com的REST API发出AJAX请求?

时间:2013-02-02 03:53:34

标签: javascript jquery ajax rest

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") },
  });

});

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

2 个答案:

答案 0 :(得分: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") },
  });
});

更新:也许您被same origin policy阻止为@thordarson注释,在这种情况下添加: dataType: "jsonp"到你的ajax电话。

答案 1 :(得分:3)

可能性1

您无权访问其API。根据他们的API page,他们非常谨慎地选择了谁可以访问他们的API。

  

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

可能性2

你被same origin policy阻止了。浏览器通常对JavaScript在不同域中发出的请求非常严格。这可以使用Cross-origin resource sharing绕过。这需要配置您要求的服务器,因此在这种情况下它不可行。

最好的办法是创建一个服务器端脚本,请求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);

?>

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

然后更改您的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's API Terms of Service

  

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

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


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

更新/注2:在调查请求网址中返回的标头后,我看不到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]