【问题标题】:Is it bad practice to return a String literal instead of a Value Object for POST and DELETE methods?为 POST 和 DELETE 方法返回字符串文字而不是值对象是不好的做法吗?
【发布时间】:2020-03-29 12:11:52
【问题描述】:
如果您处于微服务架构中,其中业务用户需要管理员权限才能从数据库中添加和删除该服务的项目,并且想要一条消息说明操作是否成功,而不是仅仅响应 201。
当您返回 POST 和 DELETE 响应时,首选的行业惯例是什么?发回一个字符串消息说它成功与否?或者最好有一个带有成员字符串消息的新值对象,并返回 getter/setter,可以序列化并返回到用户将看到的响应中?
有没有首选的方法,或者没关系?
【问题讨论】:
标签:
rest
domain-driven-design
microservices
standards
【解决方案1】:
视情况而定。
HTTP 响应的消息体在语义上是一个消息。
200 OK
Content-Type: text/plain
IT WORKED
当消息接收者是人时,对消息使用纯文本很好,因为人在语义上是灵活的。熟悉美式英语的人会理解该信息,如果您稍后决定将其更改为不那么吵闹的拼写,那么人类接收者可能会理解。
当机器读取消息时,纯文本变得不太令人满意 - 当您需要更改消息时问题就来了,并且没有结构机器很难找到他们需要的内容。
如果您查看上面的示例,标题(包括状态行)符合大约 20 年前设计的模式。 HTTP 客户端知道如何解析标头,并识别他们关心的标头等等,因为对于如何将信息编码到响应的标头中有一个很好的指定模式。
在短期内,您可以定义一个架构,其中“IT WORKED”是可能的响应之一,每个人都可以根据该架构编写他们的程序。
但是当您需要扩展架构时,要包含更多信息?您能否在不破坏老客户的情况下满足您未来的需求?
另一方面,如果升级所有客户端的成本不高(因为它们都在您的直接控制之下?),那么您可能还不需要可扩展的消息架构。