需要我的服务器返回包含数据错误的响应。需要客户查看请求中的数据有啥问题

Posted

技术标签:

【中文标题】需要我的服务器返回包含数据错误的响应。需要客户查看请求中的数据有啥问题【英文标题】:Need my server to return a response that includes a data error. Need client to see what was wrong with data in request需要我的服务器返回包含数据错误的响应。需要客户查看请求中的数据有什么问题 【发布时间】:2019-07-17 21:32:20 【问题描述】:

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

这是当前场景:

    客户端向网络服务器发出请求,要求保存一些数据 服务器查看负载,并进行 2 次检查 一种。此客户端是否被禁止保存数据? 湾。此数据的有效负载是否通过了语言过滤器? 服务器响应成功,或者这 2 个错误之一

我的端点是用 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);

然后我的客户就可以直接读取IntstatusCode并快速确定故障。

但即使我认为我可以做到,而且会奏效,但似乎不对?

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

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

字符串解析似乎更难维护,但如果有意义的话,从技术上讲似乎更“合法”?

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

【问题讨论】:

【参考方案1】:

我决定将带有 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
        
    

【讨论】:

以上是关于需要我的服务器返回包含数据错误的响应。需要客户查看请求中的数据有啥问题的主要内容,如果未能解决你的问题,请参考以下文章

Eclipse 查看 WebService 服务请求和响应消息

JMETER接口测试中,如何把察看结果树中的响应数据存储到指定文件

SpringBoot 工程中的响应标准设计及实现

http返回值

理解HTTP协议

Web 服务器能否在客户端发送完整请求之前开始响应?