0

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

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

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

4

4 回答 4

1

我使用的一种常见方法是拥有Weather并且Error两者都是Response对象并ResponseFactory创建它们。

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

于 2013-06-04T15:11:19.570 回答
1

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

使用工厂模式似乎有点过头了,特别是考虑到对象之间不相关。

于 2013-06-04T15:27:48.120 回答
0

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

作为一个经验法则,依赖 HTTP 代码——如果你得到一个 404 或 500 当然你不能想出一个解析的响应。

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

404 { "message" : "Resource not found" }
400 { "message" : "Wrong parameters given" }

所以你知道如何解析它们。

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

于 2013-06-04T15:19:51.187 回答
0

标头是否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"

这样做可以将两个问题分开:

  • 判断是否有错误
  • 将内容类型解析为应用程序中的类/类型。
于 2013-06-04T15:41:27.760 回答