我订阅了Windows Azure网站上的免费Bing Search API。我想要做的是在我的网站上添加一个面板,它使用纯粹的客户端代码(javascript)来查询Bing Search Api for News结果,我希望按相关性对其进行排序。
为了实现这一点,我发现这篇有趣的文章讨论了如何以YQL(Yahoo Query Language)存储您的身份验证信息,并将其用作查询Bing Search API的代理:http://derek.io/blog/2010/how-to-secure-oauth-in-javascript/
所以,这就是我所做的:
1)开发一个YQL开放数据表,其中包含我的Bing Key和查询参数。这是XML代码:
<?xml version="1.0" encoding="UTF-8" ?>
<table xmlns="http://query.yahooapis.com/v1/schema/table.xsd">
<meta>
<sampleQuery>
select * from {table} where query="washington"
</sampleQuery>
</meta>
<bindings>
<!-- SearchResponse.News.RelatedSearches.NewsRelatedSearch -->
<select produces="json">
<urls><url>https://a889dc2f-d0d4-4d16-9f4e-401c750deb04:IFU5P1aw5HAFJsMgOoxSyAAQyAh+m5asVkEq3GG9xIU@api.datamarket.azure.com/Bing/Search/v1/Composite?Sources=%27news%27</url></urls>
<inputs>
<key id="Query" default="'new york bonds'+NewsCategory='rt_Business'" paramType="query" />
</inputs>
</select>
</bindings>
</table>
查看我放置ConsumerID
和AccountKey
的位置?它位于URL的最开头(用冒号分隔)。
2)将此数据表保存在YQL的托管存储中。我回来执行,选择和更新存储地址。这允许我隐藏我的Auth信息,同时不需要服务器端代理。
3)使用以下给出的执行存储密钥:store:// 6sVu1WUPgFrgFcOv1bH81U从YQL控制台进行YQL查询。我们使用以下查询:
use "store://6sVu1WUPgFrgFcOv1bH81U" as T;
select * from T where Query="'Texas bonds'&NewsCategory='rt_Business'";
哦,哦......我们遇到了第一个错误。 YQL控制台吃它并吐出“无效的JSON文档”。好的,所以我认为控制台不知道如何解析这个查询。
好的,那就让我们使用REST URL来执行查询。网址是:
https://query.yahooapis.com/v1/public/yql?q=use%20%22store%3A%2F%2F6sVu1WUPgFrgFcOv1bH81U%22%20as%20T%3B%20select%20*%20from%20T%20where%20Query%3D%22%27Texas%20bonds%27%26NewsCategory%3D%27rt_Business%27%22%3B&format=json&diagnostics=true
大!但这里发生了一些有趣的事情。生成的JSON字符串中的诊断信息为:
“无法从存储中读取...不是有效的存储地址。”
我可以更少关心,只要我得到一个好的JSON字符串我不在乎。但这是问题发生的地方。尝试使用生成的REST URL来此查询:
use "store://6sVu1WUPgFrgFcOv1bH81U" as T;
select * from T where Query="'Texas bonds'&NewsCategory='rt_Business'&NewsSortBy='Relevance'";
结果为空字符串(存储网址错误相同)。
WHY?这是完全相同的查询,但它只是按相关性而不是日期对新闻结果进行排序。
有谁知道这里发生了什么事?
提前感谢您的时间,非常感谢。
P.S。我已经尝试使用其他密钥ID来使XML代码更好看,但它总是搞砸了查询。请让我知道,如果你能使这项工作我永远爱你。
您认为可能需要使用OAuth吗?