我正在构建一个RESTful Web服务.我已经阅读了为每个机制使用HTTP的原则,只要它会占用你,而且大多数时候,就像获取资源一样,它工作得很好.
但是当我需要发布某种新条目时,为了清晰和健壮,无论客户端做什么,我都想提供新条目可能失败的特定验证错误.此外,存在特定错误,例如,用于创建新用户的数据完全有效,但可以采用昵称或电子邮件地址.简单地返回409 Conflict没有详细说明昵称或电子邮件地址的详细信息.
所以解决这个问题不是火箭科学:记录一堆特定的错误代码并返回一个有错误的对象:
{ errors: [4, 8, 42] }
Run Code Online (Sandbox Code Playgroud)
这意味着在请求失败的情况下,我不会返回REST哲学所预期的资源或密钥.类似地,当我返回许多资源时,我必须以某种方式在数组中构造它们.
所以我的问题是:如果我为每个请求标准化一个信封,我是否仍然会提供一个表现良好的RESTful Web服务,例如,总有一个像这样的对象{ errors, isSuccessful, content }?
我之前已经构建了使用它的RPC风格的Web服务,但我不想做一些"几乎是REST"的东西.如果有任何关于REST的意义,我希望尽可能保持良好的行为.
如果答案是"地狱没有",我认为它可能是,我想知道它是否至少正确地解决了验证问题,并且对于这种问题解决可能是一个很好的参考,因为大多数指南我都是我发现只详细的简单案例.
我的任务是定义两个Web应用程序之间的通信.我决定使用JSON.在JSON中有一个根节点有多常见?
假设我们有一个汽车对象.这是JSON,其中"Car"是根节点:
{"Car": {
"Make":"Mustang",
"YearBuilt":"1999"}}
Run Code Online (Sandbox Code Playgroud)
所以现在让我们说我有一个Tire对象,因为我们正在标准化拥有根节点,所以这个也必须拥有它.
{"Tire": {"Make": "Brirdgestone", "Size":"15"}}
Run Code Online (Sandbox Code Playgroud)
将轮胎对象JSON集成到原始Car对象中可以显示它是多么笨重.
{"Car": { "Make":"Mustang",
"YearBuilt":"1999",
"Tires": "[{"Tire": {"Make": "Brirdgestone", "Size":"15"}},
{"Tire": {"Make": "Brirdgestone", "Size":"15"}},
{"Tire": {"Make": "Bridgestone", "Size":"15"}},
{"Tire": {"Make": "Brirdgestone", "Size":"15"}}
]}}
Run Code Online (Sandbox Code Playgroud)
所以在PHP中序列化,第一个轮胎的制造将是$object->Car->Tires[0]->Tire->Make.由于根节点,那里有额外的轮胎级别.
如果Tire没有根节点,那么代码可能会更加纤薄.
{"Car": { "Make":"Mustang",
"YearBuilt":"1999",
"Tires": "[{ {"Make": "Bridgestone", "Size":"15"}},
{"Make": "Brirdgestone", "Size":"15"}},
{"Make": "Brirdgestone", "Size":"15"}},
{"Make": "Brirdgestone", "Size":"15"}}]}}
Run Code Online (Sandbox Code Playgroud)
在PHP中,混淆较少,因为冗余较少:第一个轮胎的构造被称为 $object->Car->Tires[0]->Make
没有根节点有什么不好的吗?我喜欢拥有根节点,因为它的行为类似于类名,但是不必要的级别会让我感到很烦恼,并且会使遍历变得更加复杂.