这是一个很难正确表述的问题,因为我在"公共API"one_answers"跨域"空间的知识中有很多空白。
也许最好的方法就是举一个真实世界的例子:
我有一个骨干提线木偶应用程序。很酷。它在做很多我想让它做的事情。
我也有一些非常酷的图表-一个商业HTML5图表库。我想利用我的bb提线木偶应用程序中的图表库。
这是钥匙。我想在图表中显示的数据不是我的。这是《纽约时报》API提供的竞选财务数据(http://developer.nytimes.com/docs)。它也是其他公共api中提供的其他数据。
在我的脑海中,我想我只需将我的bb提线木偶数据模型连接到《纽约时报》提供的json URL,调用model.fetch(),解析返回的json数据,将数据绑定到我的图表,我就成功了。但无法获取数据,因为这是一个跨域请求——在JavaScript中是no。所以人们说"简单,只需实现cors"。不能那样做。我不控制《纽约时报》的服务器,所以我不能在资源的标题中添加"允许访问控制"。我尝试使用的其他公共api也是如此。我认为"实现cors"是针对"您"控制服务器的情况。
所以其他人写"……你可以在你的网站上编写一个服务器端包装器,调用《纽约时报》API。然后你让你的客户端JavaScript调用你的包装器。由于它们在同一个域上,你可以避免跨站点脚本问题。
您的客户端代码-->您的服务器端包装器-->NYT API
理论上是有道理的。这是API的出版商,如《纽约时报》、天气服务或金融数据服务等,希望人们在说"我们的API是公开的"时会做的吗?这是假设的工作流程吗?用你的服务器应用程序消费并转发到你的提线木偶客户端应用程序?这是"bb Marionetty"的方法吗?关于所涉及的公约,我在这里缺少什么?如果不通过客户端JavaScript调用(如model.fetch()),开发人员通常如何使用公共API?
我的bb提线木偶应用程序的服务器后端是ASP.NET Web API。我应该如何将bb牵线木偶模型连接到我自己的ASP.NET Web API,并让我的Web API调用《纽约时报》服务吗?我对一般"公共API"原则的理解在这里并不牢固,所以我无法得出最佳实践。
我认为他们将其称为"公共API"是有意义的,因为它对每个用户都是开放的。无需使用特殊帐户或凭据登录。
问题来自客户端,在本例中是浏览器。这是针对安全问题的同源策略。它不是"Javascript中的no",您也可以在node.js环境中这样做。
解决这一问题的方法是一种名为proxy的好方法,您可以从本文中获得更多详细信息。它被许多网站普遍使用。
另一种方式是JSONP。大多数js-libs/框架(如JQuery)都有一个包装器。它有一些限制,但可以在没有额外服务器端代码的情况下完成。
在你的情况下,我认为代理几乎是最好的做法(也许还有更好的做法)。你可以精细地控制结果,处理错误,修饰它们,甚至将它们保存在你的网页上。
当API提供者说他们的东西是公共的,但他们没有实现CORS时,你通常可以假设他们的意图是让你从自己的服务器调用API调用,该服务器将适当地进行身份验证和缓存,这样API密钥就不会暴露给用户,你的用户也不会在他们这边使用过多的资源。