2009-07-09 22 views
1

我正在开发一个REST API的那一刻,和这是核心特性之一使用了各种HTTP状态代码,返回状态/错误信息,其中一些可能是扩展的信息(例如,如果一个项目没有找到,一些其他类似的项目)将在响应主体。发送自定义HTTP错误信息给Flash,JavaScript的,等

这很好,直到你找到像Flash和JavaScript这样的客户端不能访问响应主体或头部,除非HTTP状态代码是200 OK(即使是201创建的成功代码也会导致Flash无法思考这是一个错误)。

所以我的问题是,是否有一种标准的方式允许这种类型的客户端请求所有状态代码是HTTP 200,并以另一种方式指示真实状态代码?

我想到的一个解决方案是,在HTTP Accept-*标头系列的模式中,使用X-Accept-Status扩展标头来指定可以处理哪些状态码,例如,闪存就送......

X-Accept-Status: 200 

...然后在此名单将被映射到一个是任何状态代码,并在响应体返回的错误,可能与另一个扩展头指示实状态码,例如

X-HTTP-Status-Code: 404 Not Found 

这一切似乎有点恐怖,以及对协议的工作,但如果你有不能使用的协议属性,则客户这是不可避免的。我只是在寻找的东西有点像X-HTTP-Method-Override(这是周围的协议工作不能发送PUT/DELETE请求的客户端的“标准”的方式),但无法理解的状态代码客户端。

回答

2

很好,实际上HTTPREST的问题是,REST是一个很好的主意,和HTTP描述了一个很好的实现它......但实际上,许多客户端和服务器只实现的HTTP一部分...

我不认为HTTP是必须的.​​..还是,REST是一个好主意,REST充满的系统的是一个强大的属性...那么,为什么不使用HTTP作为一个愚蠢的传输层为REST FUL系统?

这就是你正在做的事情,虽然在我看来,你对HTTP有点太过分了,它所有的理论上都是内置功能......你真的需要在状态代码中传输信息吗?

不取决于你的传输协议/层上这么多......心中有一个明确的想法,你的服务应该是如何工作的?它的实现单独的协议语义...客户端和服务器上。 ..抽象你的REST富裕和身份代码太多(使他们更多,然后只是整数...使它枚举,或对象...为什么不...?)

然后插件协议/运输层随意...

  • 做出标准HTTP实现
  • 使哈克一个,使用你所描述的解决方案(这对我来说似乎是完全有效的......如果人们使用的技术无法使用这些标准,为什么要打扰太多寻找最符合标准的解决方案)
  • 使您有时间做的任何事情,并且您的服务器能够做到,二进制,JSON,XML ...无论似乎足以...

两个技术笔记,虽然:

  1. flash播放器确实是在浏览器HTTP交通...它根本没有得到状态码从浏览器...以及它取决于浏览器其实......规格说明,它不适用于:“用于Macintosh的Netscape,Mozilla,Safari,Opera和Internet Explorer。” ...所以IE的窗户应该工作?铬?我不知道......但我认为,没关系,因为很明显,你不能依赖它......哦,并且要说明最明显的情况:当然,JavaScript也会在浏览器上执行它的HTTP。 ..所以同样的问题在这里...
  2. 这两个暗示,如果你会成功找到类似X-HTTP-Method-Override的响应,这是内置在协议中,一个好的浏览器会明白,并会重新映射相应的东西, 再决定给哪些信息JavaScript或第三方插件...所以你会再次结束了没有...我想...

,你应该简单地选择基于你的响应方法客户......也许是客户应该发送一些额外的信息,如果它不能使用HTTP标准...否则抛出它,遵循标准...我首先使用标准HTTP进行实施,但仍然隐藏HTTP本身,并且一次一切正常,使用

格尔茨

back2dos写一个

0

我错了,如果认为不应该让一个残缺外的现成潜在客户的API决定的特征API实现?我想实际的考虑赢得了一天,但总的来说,我猜我的投票赞成“正确”构建API实现,并需要根据需要定制客户端编程。

+1

问题是什么时候客户端根本没有办法使用“正确”构建的应用程序。想象一下与你的经理交谈......你:“不,我们不能让[插入大公司]在API中使用API​​,即使他们会付钱给我们(在这里插入大量资金),因为他们无法调用它完美的方式“。老板:“改变它,让他们可以称之为现在。” – 2009-07-17 10:50:10

0

位晚了反应,但......

当我实现了一个Flash客户端API与OpenRasta的早期版本,我已经包含响应代码和文字,每个发出的请求X-ResponseLine。由于标题默认只有通用标题,因此它们没有涉及缓存,所以没有理由对此有Accept/Vary。