我的 Web 应用程序进行 REST 调用。如果调用成功,它将返回一个“天气”json 对象。如果调用失败,它将返回一个 json 错误对象。
我想创建一个类来解析生成的 JSON,Weather
如果调用成功则返回一个对象,Error
如果调用失败则返回一个对象。
我正在考虑使用工厂模式,但我不确定这是否是一种好方法,因为这两个对象彼此非常不同。设计此代码的好方法是什么?
我的 Web 应用程序进行 REST 调用。如果调用成功,它将返回一个“天气”json 对象。如果调用失败,它将返回一个 json 错误对象。
我想创建一个类来解析生成的 JSON,Weather
如果调用成功则返回一个对象,Error
如果调用失败则返回一个对象。
我正在考虑使用工厂模式,但我不确定这是否是一种好方法,因为这两个对象彼此非常不同。设计此代码的好方法是什么?
我使用的一种常见方法是拥有Weather
并且Error
两者都是Response
对象并ResponseFactory
创建它们。
我强烈建议您在设计服务时使用正确的 HTTP 代码,因为它们可以更全面地了解每个调用的状态和成功。
您需要首先检查调用的结果,然后决定如何处理它,可以使用返回 JSON 对象的错误回调和返回Error
JSON 对象的成功回调来处理所有错误代码Weather
。如果需要,您可以使用 HTTP 代码创建正确的响应并进一步细分逻辑以返回更具体的错误。
使用工厂模式似乎有点过头了,特别是考虑到对象之间不相关。
这实际上取决于您将使用 API 的环境。
作为一个经验法则,依赖 HTTP 代码——如果你得到一个 404 或 500 当然你不能想出一个解析的响应。
以一致的方式格式化您的错误响应,例如
404 { "message" : "Resource not found" }
400 { "message" : "Wrong parameters given" }
所以你知道如何解析它们。
如果你得到一个200 OK
你知道一切都是正确的,你可以毫无问题地解析你的响应。
标头是否Content-Type
因响应类型而异?
正如一些人在他们的回答中指出的那样,应该使用 HTTP 状态代码来确定“是否有错误”,但同样重要的是对返回的内容类型的解释。
希望Content-Type
标头确实有所不同,我建议使用解析器注册表,由它们处理的内容类型注册,然后委托给它们处理了解如何将特定内容类型转换为您想要的对象。在 Ruby 中,由于您没有指定特定语言:
case response.status:
when 200..299
return parsers[response.content_type].parse(response.body)
when 400..499
raise parsers[response.content_type].parse(response.body)
else
raise "Unhandled response status"
这样做可以将两个问题分开: