Parsing REST调用可能导致两个不同的JSON对象。我应该使用什么设计模式?

Parsing REST调用可能导致两个不同的JSON对象。我应该使用什么设计模式?,parsing,rest,design-patterns,Parsing,Rest,Design Patterns,我的web应用程序进行REST调用。如果调用成功,它将返回一个“weather”json对象。如果调用失败,它将返回一个json错误对象 我想创建一个类,解析生成的JSON,如果调用成功,则返回一个Weather对象,如果调用失败,则返回一个Error对象 我正在考虑使用工厂模式,但我不确定这是否是一个好方法,因为这两个对象彼此非常不同。设计此代码的好方法是什么 我使用的一种常见方法是将天气和错误都作为响应对象,并创建一个响应系数 我强烈建议您在设计服务时使用适当的HTTP代码,因为它们可以更全

我的web应用程序进行REST调用。如果调用成功,它将返回一个“weather”json对象。如果调用失败,它将返回一个json错误对象

我想创建一个类,解析生成的JSON,如果调用成功,则返回一个
Weather
对象,如果调用失败,则返回一个
Error
对象


我正在考虑使用工厂模式,但我不确定这是否是一个好方法,因为这两个对象彼此非常不同。设计此代码的好方法是什么

我使用的一种常见方法是将
天气
错误
都作为
响应
对象,并创建一个
响应系数


我强烈建议您在设计服务时使用适当的HTTP代码,因为它们可以更全面地了解每个调用的状态和成功情况。

这实际上取决于您将使用API的环境

根据经验,依赖HTTP代码——如果您得到404或500,当然您无法得到解析响应

以一致的方式格式化错误响应,例如

404 { "message" : "Resource not found" }
400 { "message" : "Wrong parameters given" }
所以你知道如何解析它们


如果你得到了一个
200 OK
你知道一切都是对的,你可以毫无问题地解析你的响应。

你需要首先检查调用的结果,然后决定如何处理它,并有可能通过返回
error
JSON对象的错误回调来处理所有错误代码,以及返回
Weather
JSON对象的成功回调。如果需要,您可以使用HTTP代码创建适当的响应,并进一步细分逻辑以返回更具体的错误


工厂模式的使用似乎有些过分,特别是考虑到对象之间没有关联。

根据响应的类型,
内容类型是否会有所不同

正如一些人在回答中指出的那样,应该使用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"
这样做将两个问题分开:

  • 确定是否存在错误
  • 在应用程序中将内容类型解析为类/类型

问题在于Weather对象在我的MVC模式中是一个模型类。我认为如果我要从响应中继承,这会有点混乱。@W.K.s,这肯定是个问题。但这是一个实现问题——最初的问题并没有说明已经有了模型或响应实现。我所做的一些工作将错误放入日志(db)中,从而证明错误对象也是模型对象。我正在考虑创建一个
WeatherException
类(稍后我会给出一个更好的名称),其中包含所有错误代码和消息。因此,如果代码成功,
WeatherFactory
将创建
Weather
对象,但如果代码失败,它将创建并抛出
WeatherException
。这仍然符合工厂模式吗?