首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Web服务器结构

Web服务器结构
EN

Software Engineering用户
提问于 2020-04-18 13:57:56
回答 2查看 118关注 0票数 1

这似乎是一个奇怪的问题,但我还没有找到一个“适当的”答案。我尝试过谷歌搜索,但我找不到任何有用的东西(也许我找错了条件)。

我正在参加几个构建Web的课程,一个使用Spring,另一个使用NodeJS (与Express一起使用),我们被告知使用逻辑层,比如“服务层”或“数据层”,但我还没有完全理解哪些职责应该属于谁。

例如,在Spring项目中,我得到一个POST请求,我的处理程序接收一个DTO,然后我需要执行以下步骤:

  • 将DTO转换为模型对象
  • 根据业务规则验证模型
    • 如果验证失败并返回错误响应,则抛出异常。

  • 将模型保存到数据库中
  • 返回OK响应

我很难理解每个步骤属于哪个“逻辑”层(因为我还没有完全理解分层),特别是谁处理错误以及如何处理这些错误。例如,如果由于业务规则而导致验证失败,那么我抛出的异常不应该知道HTTP,但是捕获它并映射到适当的HTTP错误是谁的工作呢?

谢谢你的帮助。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2020-04-18 15:17:58

数据层处理持久化数据。有时被称为持久性层。因此,这将包括从数据库中读取、将模型保存到数据库,等等。因此,所有的数据库访问都是通过数据层完成的。服务层将使用数据层访问和修改存储在数据库中的数据。

服务层和两个数据层都可以处理验证,但通常在服务层进行验证,因为对于大多数实体/模型来说,验证逻辑对于数据库或文件等不同的持久性方法保持不变。对于复杂的验证,服务层可以在单独的Validator类上调用validate。

如果希望使用特定的状态代码进行响应,可以将@ResponseStatus注释添加到要响应请求的状态代码的异常中,然后让未察觉的异常为框架传播,以将其转换为http响应。

代码语言:javascript
复制
@ResponseStatus(code = HttpStatus.BAD_REQUEST)
public class YourException extends RuntimeException {

当抛出本机未处理异常时,您可以让框架处理它们。这将导致状态500响应。

因此,对于您的步骤,我会这样实现它们:

  • 服务层:将DTO转换为模型对象
  • 服务层:根据业务规则验证模型
  • 服务层:如果验证失败,抛出异常并返回错误响应(让框架处理错误响应部分)
  • 数据层:将模型保存到数据库中
  • 服务层:返回一个OK响应(返回void并让框架处理成功响应)
票数 3
EN

Software Engineering用户

发布于 2020-04-18 14:40:06

通常,您不需要执行任何特定的映射,因为它是由您使用的框架直接执行的。

例如,在HTTP中,您只需指定验证规则,让框架执行其余的操作,即检查输入是否有效,如果没有,则返回适当的ASP.NET响应,并使用适当的MIME类型和适当的HTTP代码。

类似地,如果服务器上出现意外情况,例如您试图保存一个文件,但由于RAID控制器遇到错误并将所有磁盘切换到只读模式,则会出现异常,那么您只需让异常传播到框架,该框架将向调用方返回HTTP 500。

与自己处理异常相比,这有一个额外的好处。您可以轻松地添加行为,如日志记录或自定义错误页。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/408971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档