如果REST API返回JSON,则为哪种MIME类型?


68

我的REST API返回JSON。

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

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

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

HTTP状态代码是否应保留在200 OK


对此的所有答案似乎都假定涉及浏览器。我的REST应用程序发送并响应json消息。所有序列化和反序列化都由客户端和服务器在内部完成。第三方浏览器与此无关,它是非常特定的机器,对于非常特定的非公共机器。在这种情况下,“ application / every_type”的差异为零,全都是文本。“ application / json”确实强调了数据是json,但仅作为注释,而这已经是使用API​​的任何人所知道的第一件事。
MickeyfAgain_BeforeExitOfSO

1
@mickeyf-浏览器支持HTTP协议的事实并不意味着M2M应用程序不应该。如果您要编写不支持Accept和Content-Type标头(tools.ietf.org/html/rfc7231#section-3.1.1.5)的应用程序,则可以这样做,但是其他M2M开发人员可能希望支持以标准方式提供多种媒体类型(例如,应用程序/ cbor)。
戴夫

Answers:


78

JSON规范建议application/json,并且IETFIANA注册表似乎支持该规范。

关于第二个问题,我认为如果消息处理以某种方式失败,则应该以JSON消息的形式返回结构化和标准的错误响应。仅当由于某种原因而无法将消息传递到后端处理程序时,才应考虑使用HTTP错误代码。

2014年6月27日更新:客户端(浏览器)只能使用200个响应的日子已经过去了,RESTful API的主要建议是使用适合于响应的HTTP响应代码,2xx表示成功的响应(例如201创建用于PUT;“ 204无内容可删除”)和4xx和5xx用于所有错误情况,包括来自API本身的错误情况。


感谢您指向JSON规范的链接。我发现了另一个stackoverflow问题,该问题指向另一个MIME类型“ text / x-json”。不知道有什么区别。 stackoverflow.com/questions/95554/...
阿席达卡

7
出于实际原因(例如,您混合使用了Flex的恐怖的HTTP客户端),有时您必须为所有内容使用200。但是,在正常情况下,您想针对这种情况使用最合适的HTTP状态代码。
鲍勃·阿曼

2
@ashitaka:另一个问题专门询问如何将JSON设置为text / x-json。它没有声称这是JSON的正确媒体类型。
劳伦斯·多尔


10

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


2
David似乎已经离开了SO,但是没有其他人可以支持上述声明并提出一些论点,为什么这是一个好(或坏)做法?根据上面的软件猴子的回答,我看到,返回带有有效JSON响应的HTTP错误是一个错误的主意。如果确实存在错误,则服务器应仅发送回HTTP错误。
trejder 2013年


6

根据RFC 4627的规定,正确Content-type返回的值还注册了MIME类型IANA(实际上,它显示在IANA的页面上)。当然,如果您要编写客户程序,那么您希望在接受的内容上更加自由,并且还要接受诸如和的其他内容。application/jsontext/jsontext/x-json

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


1

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

注意:RESTful API可以使用媒体类型application / json,但是该媒体类型没有超文本链接的RESTful接口,因此它将是状态更改的终点。

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

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

REST APIS必须是超文本驱动的

换句话说,如果应用程序状态的引擎(以及API)不是由超文本驱动的,则它不能是RESTful的,也不能是REST API。期。

另外,从该文章的讨论中可以看到一个RESTful应用程序的示例:Lost Boys的Spam-E REST应用程序

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.