Tag: 其余的

RESTful发送命令的方式

你如何发送“命令”到RESTful服务器? 用例:我的服务器caching某些信息,以便在每次请求信息时不必读取数据库。 我需要一种方法来从我的客户端应用程序发送命令来告诉服务器刷新caching。 你会使用POST或PUT的一些URL,如“… / flush_cache”? “命令”并不是真正需要“具象状态传输”的数据,除非被传输的状态是命令的结果 – “切换closures”,“caching刷新”等。一般来说, REST发送命令到服务器?

在Clojure中开发RESTful Web服务有什么好的起点?

我正在寻找轻量级的东西,至less应该支持以下function: 支持通过元数据轻松定义操作 从请求提取参数到clojure映射的包装器,或作为函数参数 支持多种forms的authentication(基本,表单,cookie) 基于api方法元数据的基本授权 包裹在clojure地图中的会话对象 REPL实时编码(无需重启服务器) 将返回值自动序列化为json和xml 有好的(可插入的)url参数处理(例如/ action / par1 / par2而不是/ action?par1 = val1&par2 = val2) 我知道为这些选项中的每一个select一个自己的微观框架是相对容易的,但是为什么要重新发明轮子? 特别是如果它是: 活跃的项目,贡献者/用户数量不断增加 至less有基本的文档和教程在线。

REST风格取消删除

支持数据服务的反删除或延迟/批处理删除是相当常见的要求。 我想知道的是如何以一种RESTful的方式来实现这一点。 我在几个不同的select之间撕裂(其中没有一个对我来说似乎非常有吸引力)。 我相信,在这些不同的选项中,通常需要一个API,它将所有标记为已删除的资源都返回给特定的资源types。 这里有一些我曾经考虑的选项和一些优点/缺点: 将资源标记为已删除的选项: 使用HTTP DELETE将资源标记为已删除。 使用HTTP PUT / POST来更新已删除的标志。 这不正确,因为它将本质上是从HTTP DELETE方法中删除的内容映射到其他HTTP方法。 GET-ing资源标记为删除时的选项: 为标记为已删除的资源返回HTTP状态404。 清洁和透明,但我们如何区分真正被删除的资源和被标记为已删除的资源之间的区别。 返回HTTP状态410.提供方式来区分不同的情况,但是技术上来说410“被认为是永久性的。具有链接编辑能力的客户端应该在用户批准后删除对Request-URI的引用。 在这里“预计”和“应该”可能有足够的摆动空间。 不知道在客户端支持/理解410。 返回HTTP状态200并且包括标志字段指示资源被删除。 这看起来很奇怪,因为首先删除它的想法是因为你真的希望它不出现。 这将过滤掉已删除资源的责任推到了客户端。 包含此已删除资源的回复选项: 省略被删除的资源。 干净简单。 但是如果你真的想知道被删除的资源呢? 将它们与字段一起包括在内,表示它们已被删除。 这将过滤掉已删除资源的责任推到了客户端。 如果您只想通过活动或已删除的资源进行分页,分页会变得非常棘手。 更新标记为删除的资源时的选项: 使用HTTP状态404.资源是否正确? 但是,怎样才能区分标记为已删除的资源和实际删除的资源。 404响应中的HTTP主体可能会在这里消除歧义,但是客户端仍然会parsing/解释你的身体以消除歧义。 也许响应标题可能有帮助吗? 哪一个? 自定义标题? 使用HTTP状态409以及有关资源如何首先被取消删除的消息。 取消删除标记为删除的资源的选项: 使用HTTP PUT / POST进行资源更新操作,并将其标记为活动状态。 只有当您没有为资源的GET操作返回一个HTTP 404时,它才会起作用,因为它不会因为PUT / POST而导致资源“找不到”(404)。 使用HTTP PUT / POST进行资源的创build操作。 这里的问题是哪些数据优先? 在创build操作中发送的数据? 或者正在取消删除的数据? 将其从任何其他将返回的查询中筛选出来。 […]

我可以更改浏览器发送的HTTP请求的标头吗?

我正在寻找一个宁静的devise,并希望尽可能地使用HTTP方法( POST , GET ,…)和HTTP头。 我已经发现浏览器不支持HTTP方法PUT和DELETE 。 现在我正在寻找相同资源的不同表示,并希望通过更改请求的Accept头来完成此操作。 根据此Accept头,服务器可以在同一资源上提供不同的视图。 问题是,我没有find一种方法来告诉我的浏览器改变这个头。 <a..> ..>标签有一个types属性 ,可以有一个MIMEtypes,看起来像一个很好的候选人,但头仍然是浏览器的默认值(在Firefox中可以改变about:config与network.http.accept.default键)。

REST api版本控制(仅版本表示,而不是资源本身)

我看了一下API版本的最佳实践? ,但是我不太相信答案,所以我再次以更具体的例子来质疑版本控制部分。 我有两个URI(一个版本是URI的一部分,另一个没有): http://xxxx/v1/user/123 -> favored solution in discussed thread http://xxxx/user/123 我怀疑第一个链接是否expression了REST的想法。 我发现http://xxxx/v1/user/123令人困惑,因为它暗示有一天会有一个更高的api版本,像http://xxxx/v2/user/123 。 但是这在REST术语中没有意义,api版本本身就是HTTP 1.0或1.1,它已经在HTTP请求中发送了。 这个以REST资源为中心的视图与其他api接口(如SOAP或Java接口(通常在限定名称中包含api-versions))之间的差别很大。 在REST中,版本控制唯一有意义的是该资源的表示(例如添加或删除新的字段)。 这个版本控制属于内容协商的部分,如: http://xxx/user/123 + HTTP 'Accept' Header -> Content negotation through header http://xxx/user/123?v=1 -> for perma-links/hyperlinks 人们也可以争辩说,这样的版本内容协商可能是path中的URI的一部分,但是我觉得它是违反直觉的,因为你可能以同一资源的不同的URI结束,并且必须在某个时刻保持redirect。 综上所述:在REST URI中没有api版本化,只有资源表示的版本。 表示版本信息属于内容协商(作为queryParam或HTTP“接受”)。 你怎么看? 你会不同意/同意哪些事情?

ASP .NET MVC 4 WebApi:手动处理OData查询

我有一个使用ASP.NET MVC 4提供的WebAPI制作的Web服务。我知道WebAPI工作的顶层自动处理OData查询 (例如$filter , $top , $skip ),但是如果我想自己处理过滤? 我不只是从我的数据库返回数据 ,但我有另一个层添加一些属性,进行一些转换等。所以查询我的所有数据,转换他们,并返回到WebAPI类OData过滤不仅仅是好足够。 这当然是非常缓慢,通常是一个糟糕的主意。 那么是否有一种方法可以将我的WebAPI入口点的OData查询参数传播到我调用的函数来获取和转换数据? 例如,GET to /api/people?$skip=10&$top=10会在服务器上调用: public IQueryable<Person> get() { return PersonService.get(SomethingAboutCurrentRequest.CurrentOData); } 在PersonService : public IQueryable<Person> getPeople(var ODataQueries) { IQueryable<ServerSidePerson> serverPeople = from p in dbContext.ServerSidePerson select p; // Make the OData queries // Skip serverPeople = serverPeople.Skip(ODataQueries.Skip); // Take serverPeople = serverPeople.Take(ODataQueries.Take); // […]

RESTdevisefile upload

我需要为file upload服务创build一个REST API,允许用户: 打开一个会话 上传一堆文件 closures会话 然后,再回来做一些上一个会话中上传的文件。 为了便于处理关于每个文件的数据并处理文件本身的内容,这就是我正在考虑使用的URIscheme: /sessions/ /sessions/3 /sessions/3/files /sessions/3/files/5 /sessions/3/file/5/content /sessions/3/file/5/metadata 这将允许文件元数据从文件内容分开处理。 在这种情况下,只允许在文件内容和文件元数据上进行GET,并且更新其中任何一个,新文件必须是PUT。 这有道理吗? 如果不是的话,为什么,怎么会更好?

将API密钥放在标题或url中

我正在为公司的数据devise一个公共API。 我们希望应用程序开发人员注册一个API密钥,所以我们可以监视使用和过度使用。 由于API是REST,我最初的想法是把这个键放在一个自定义的头文件中。 我就是这样看到谷歌,亚马逊和雅虎这样做的。 另一方面,我的老板认为,如果密钥简单地成为URL的一部分,则API更易于使用,例如“http://api.domain.tld/longapikey1234/resource”。 我猜这有些事情要说,但它有点违反了URL的原则,只是简单地说明你想要的东西,而不是如何或为什么你想要它。 你会发现把密钥放在URL中是合乎逻辑的吗? 或者,如果将一个简单的JavaScript前端写入某些数据,您是不是必须手动设置HTTP标头?

如何pipe理版本化API的底层代码库?

我一直在阅读关于ReST API的版本控制策略,而且他们似乎没有解决的是如何pipe理底层代码库。 比方说,我们正在对API进行一些重大更改 – 例如,更改我们的客户资源,以便返回单独的forename和surname字段,而不是单个name字段。 (在这个例子中,我将使用URL版本解决scheme,因为它很容易理解所涉及的概念,但是这个问题同样适用于内容协商或自定义的HTTP头部) 我们现在在http://api.mycompany.com/v1/customers/{id}有一个端点,在http://api.mycompany.com/v1/customers/{id}另一个不兼容的端点。 我们仍在向v1 API发布错误修正和安全更新,但新function开发现在都集中在v2上。 我们如何编写,testing和部署对我们的API服务器的更改? 我可以看到至less有两个解决scheme: 为v1代码库使用源代码控制分支/标记。 v1和v2是独立开发和部署的版本控制合并,在两个版本中都使用相同的修补程序 – 类似于在开发新版本时如何pipe理原生应用程序的代码库,同时还支持以前的版本。 使代码库本身意识到API版本,所以你最终得到一个包含v1客户表示和v2客户表示的代码库。 将版本控制视为解决scheme架构的一部分,而不是部署问题 – 可能使用命名空间和路由的某种组合来确保请求由正确的版本处理。 分支模型的一个明显的优点是删除旧的API版本是很简单的 – 只要停止部署相应的分支/标签 – 但是如果你运行的是多个版本,那么最终可能会有一个非常复杂的分支结构和部署pipe道。 “统一的代码库”模式避免了这个问题,但是(我认为呢?)会使代码库中被废弃的资源和端点不再需要的时候更难。 我知道这可能是主观的,因为这不太可能是一个简单的正确答案,但我很好奇,要了解在多个版本中维护复杂API的组织是如何解决这个问题的。

什么是网站API的黄金标准? Twitter,Flickr,Facebook等

似乎今天的网站有两类API。 API允许网站的function扩展,如Facebook,Myspace等。这些API似乎非常多样化。 允许与Twitter,Flickr等现有网站function交互的API。这些都声称是基于REST的,但实际上只是“HTTP上的数据”。 如果您正在创build一个允许function扩展和外部交互的网站,那么您将使用哪些现有API作为参考模型?