2009-01-01 123 views
58

我的REST API返回JSON。REST API返回JSON的MIME类型是什么?

我目前正在返回text/plain作为MIME类型,但感觉很有趣。 我应该返回application/x-javascript还是其他类型?

第二个问题是关于错误条件的HTTP状态码。 如果我的REST API返回错误状态,我回来的JSON

{ result: "fail", errorcode: 1024, errormesg: "That sucked. Try again!" } 

如果HTTP状态代码保持在200 OK

+0

所有的答案,这似乎认为浏览器参与。我的REST应用程序发送和响应json消息。所有的序列化和反序列化都是在客户端和服务器内部完成的。第三方浏览器与其中的任何一个都没有任何关系,对于非常具体的非公用计算机来说,这些都是非常具体的机器。在这种情况下,“application/whatever_type”使得零差别,它只是文本。 “application/json”确实强化了数据是json,但只是作为评论,这已经是任何使用API​​的人都会知道的第一件事了。 – mickeyf 2017-02-08 15:32:03

回答

70

JSON规范建议application/json,这似乎是由IETFIANA注册表支持。

第二个问题,我认为如果消息处理失败了,你应该返回一个结构化的标准错误响应作为JSON消息;只有当由于某种原因将消息传递给后端处理程序失败时,才应考虑HTTP错误代码。

更新2014年6月27日:其中客户端(浏览器)只用200响应工作的日子早已过去和RESTful API中流行的建议是使用适当的HTTP响应代码的响应,为2XX对于所有错误条件(包括来自API本身的错误条件)的成功响应(例如201为PUT创建; 204为DELETE无内容)以及4xx和5xx。

+0

感谢您提供JSON规范的链接。我发现另一个指向另一个MIME类型“text/x-json”的stackoverflow问题。不知道有什么区别。 http://stackoverflow.com/questions/95554/overriding-a-mime-type-in​​-rails – ashitaka 2009-01-01 03:38:57

+6

对于实际的原因(例如说你有在混合Flex的可怕的HTTP客户端),有时你必须使用200为了一切。但是,在正常情况下,您希望针对该情况使用最合适的HTTP状态码。 – 2009-10-31 05:08:24

10

我更愿意回复HTTP错误状态和应用程序特定的有效负载。

10

不,你不应该在错误情况下返回200。

可以重复状态码或在响应有效载荷中包含更详细的错误代码。

6

根据RFC 4627,返回的合适的Content-typeapplication/json,它也注册MIME类型IANA(实际上,它显示在IANA的页面上)。当然,如果你要写一个客户,你会希望在你接受的内容中更加自由,同时也接受其他人,比如text/jsontext/x-json

现在,如果有错误,您应该而不是返回HTTP 200,这基本上是非RESTful。我知道有时候你的错误并不完全匹配,但是在RFC 2616 Sections 10.4 -10.5中选择最接近的4XX(客户端错误)或5XX(服务器错误)错误,并且在JSON中更精确。

0

如果使用“REST API”表示您希望遵循REST体系结构,则要使用的介质类型取决于您希望通过REST API公开的功能。你想创建新的对象吗?查询对象列表?编辑一个对象?如果是这样,那么使用一个好的RESTful媒体类型可能是vnd.collection + json,因为它定义了一个超文本链接接口来操纵json对象的集合。

注:一个RESTful API可以使用的媒体类型应用程序/ JSON,但这种媒体类型不具有超文本链接的RESTful接口,所以它会在状态变化的终点。

遵循Web API体系结构也是完全可以接受的,其中HTTP RPC调用返回应用程序/ json对象,其他HTTP RPC调用操作这些对象,并且没有用于使用和浏览状态更改的超文本链接接口。但这不是REST。

我喜欢REST的描述(来自REST的创建者):

REST APIS must be hypertext driven

换句话说,如果应用程序状态(并因此使API) 发动机没有被驱动通过超文本,那么它不能是RESTful,也不能是REST API。期。

此外,从该职位的讨论是一个RESTful应用例:Lost Boys's Spam-E REST Application