需要我的服务器返回包含数据错误的响应。需要客户查看请求中的数据有啥问题
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);
然后我的客户就可以直接读取Int
statusCode
并快速确定故障。
但即使我认为我可以做到,而且会奏效,但似乎不对?
我应该改用标准的 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 服务请求和响应消息