需要我的服务器返回包含数据错误的响应。需要客户端查看请求中的数据出了什么问题

时间:2019-07-17 21:32:20

标签: express webserver httpresponse rx-swift rx-cocoa

很快就会明白,我以前从未认真编写过Web服务器

这是当前情况:

  1. 客户端向Web服务器发出请求,要求保存一些数据
  2. 服务器查看有效负载,并进行2次检查
    一种。禁止该客户端保存数据吗?
    b。该数据的有效载荷是否通过语言过滤器?
  3. 服务器成功响应,或者是这两个错误之一

我的端点是用TypeScript中的Express编写的

class ChatRequest {
  public uid: string;
  public message: string;
}


export const register = (app: express.Application, deps: dependencies.IDependencies) => {
  app.post("/sendChat", (req: express.Request, res: express.Response) => {
    transformAndValidate(ChatRequest, req.body)
      .then((sendGlobalChatRequest: SendGlobalChatRequest) => {
        const payload = {
          message: sendGlobalChatRequest.message,
          uid: sendGlobalChatRequest.uid
        };

        //Check if uid is banned here

        //Check if payload passes language filter here

        //Save Payload here

        res.sendStatus(200);
      }, (err) => {
        deps.logger.error(err);
        res.sendStatus(503);
      });
  });

我一直在使用本文作为参考: https://hackernoon.com/the-request-sent-bad-data-whats-the-response-94088bd290a

但是我认为我的结论是他们正在讨论一些稍有不同的事情。

因此,据我了解,我可以组成HTTP代码... 因此如果禁止使用uid,我可以res.sendStatus(499);进行操作,如果有效载荷未通过语言过滤器,则可以res.sendStatus(498);进行操作

然后我的客户只需阅读Int statusCode并快速确定故障。

但是,即使我认为我可以做到,而且行得通,这似乎也不对吗?

我应该使用标准的HTTP响应代码吗? https://developer.mozilla.org/en-US/docs/Web/HTTP/Status

然后在响应的正文中添加String或我的客户端可以解析以确定错误的内容?

String解析似乎很难维护,但从技术上讲,如果可行的话,看起来更“合法”?

让我的客户确定服务器端错误类型的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我决定返回JSON映射错误到布尔值400

    if (isProfane(message)) {
      res.status(400).json({messageContentBlocked: true});
    }

通过这种方式,客户端可以一次收到针对该请求的多个错误,并且更加明确

万一有人在搜索,我正在使用RxSwift / RxCocoa

这是我在客户端上处理错误的方法:

extension Error {
    var chatMessageBlockedURLError: Bool {
        guard let rxCocoaURLError = self as? RxCocoaURLError else {return false}
        switch rxCocoaURLError {
        case let .httpRequestFailed(response, data):
            guard response.statusCode == 400, let data = data else {return false}
            let decoder = JSONDecoder()
            decoder.dateDecodingStrategy = .millisecondsSince1970
            guard let errors = try? decoder.decode([String:Bool].self, from: data) else {return false}
            return errors["messageContentBlocked"] == true
        default:
            return false
        }
    }
}