当前位置: 首页 > 知识库问答 >
问题:

API控制器和基础服务-参数验证的责任

濮阳研
2023-03-14

也许这是一个微不足道的情况,但它对我来说很困惑,我需要一些澄清,如何以正确的方式处理它。

为了简单起见,模型如下:

(User被分配给许多项目,且project有许多用户被分配给)。

null

…\Api\v1\Projects\{projectId}\users\{userId}

允许两个http操作:

API控制器使用服务层来执行这些操作。服务接口为休闲状态:

void projectService.assignUser(int projectId, int userId)
void projectService.dismissUser(int projectId, int userId)

服务使用dbContext来执行这些操作。

问题1:哪个元素应该负责检查projectId和userId是否正确?IMHO最好把这个逻辑放在服务层,因为它可以重用。

问题2:如果projectId和userid不正确(例如:project/user不存在或不允许赋值),这些方法应该返回什么?

我的第一个想法是返回空值,但我认为这没有太大意义。主要是因为如果enitiyId不正确,service中的类似方法将返回null。例如:ProjectService.GetProject(projectId)如果项目不存在,则返回null

第二个方法是回击布尔。False至少有一个参数不正确

第三个想法是用Message抛出ArgumentException。它似乎是好的,但它使api控制器捕捉异常。

共有2个答案

陈扬
2023-03-14

答案1:您应该不断验证ProjectId/UserID到服务层以供重用,并在任何需要的地方调用这些函数。

答案2:基于valid/invalid projectid/userid创建一个json。它可能包含与用户或项目相关的详细信息(如果两者都有效),并且在Id无效的情况下返回错误消息和错误Id(例如1表示无效的项目,2表示无效的用户)。

a)JsonObject ProjectService.AssignUser(int projectId,int userId)

EG:br>有效ID(两者):

stat":“OK”,“userId”:“userId here”,“projectId”:“projectId here}

无效的项目ID:

null

b.JsonObject ProjectService.DispersUser(int projectId,int userId)

有效ID(两者):

状态“:”OK}

无效的用户ID:

ErrorMsg:无效的用户ID,Stat:FaileError:2}

万俟穆冉
2023-03-14

Q1)我认为将它们放置在服务层是一个有效的想法,我可以想到许多您可能想要重用这些方法的场景。

null

public class BusinessLogicMessage<T> where T : new()
    {
        public BusinessLogicMessage(T result)
        {
            Result = result;
            Status = BusinessLogicStatus.Success;
            Message = string.Empty;
        }

        public BusinessLogicMessage(T result, BusinessLogicStatus status, string message)
        {
            Result = result;
            Status = status;
            Message = message;
        }

        public BusinessLogicStatus Status { get; set; }
        public string Message { get; set; }
        public T Result { get; set; }
    }

    public class BusinessLogicMessage
    {
        public BusinessLogicMessage()
        {
            Status = BusinessLogicStatus.Success;
            Message = string.Empty;
        }

        public BusinessLogicMessage(BusinessLogicStatus status, string message)
        {
            Status = status;
            Message = message;
        }

        public BusinessLogicStatus Status { get; set; }
        public string Message { get; set; }
    }

    public enum BusinessLogicStatus
    {
        Success,
        Failure,
        Warning
    }

因此,如果方法成功,只需返回类的默认构造函数,该构造函数的状态为“成功”。如果失败或其他情况发生,您可以添加详细信息。如果需要为该方法返回特殊结果对象,则可以将其附加到结果

我的两分钱。

更新为更好的答案。

 类似资料:
  • Controller控制器 第一个控制器 {#1第一个控制器} <?php namespace src\Web\Controller\Group; use Controller; use Request; use JsonResponse; class GroupController extends Controller { public function indexAction()

  • 问题内容: 在课堂上,我们现在学习如何构建Spring应用程序,即使没有直接涉及spring,我们也学习了如何为DAO和服务层对象创建接口。 如果我错了,请纠正我:DAO层是非常抽象的:它仅包含CRUD操作,并进一步用于读取数据(即:获取所有对象,获取特定对象等) 服务层:包含用于创建事物和删除事物的服务,这是业务逻辑应该存在的地方。 现在,所有这些对于服务层来说都是有意义的。除了“更新”对象。你

  • 控制器 控制器名称空间前缀统一为 “{$APPLICATION_DIR}Controller,即系统默认应用目录为App,那幺所有的控制器均应在/App/Controller目录下。 所有的控制器都应继承CoreAbstraceInterfaceAbstractController。 关于AbstractController中的抽象方法 easyswoole中,任何控制器都需继承AbstractC

  • Rest is not idleness, and to lie sometimes on the grass under trees on a summer’s day, listening to the murmur of the water, or watching the clouds float across the sky, is by no means a waste of time

  • 在相当长的一段时间里,我试图找出在Spring MVC应用程序中应该在哪里对用户输入进行验证。在许多在线博客和教程中,我基本上读到控制器应该验证用户的输入,如果无效,则通过显示包含错误消息的页面来响应用户。然而,我目前对Spring和Spring MVC分层系统的理解是,控制器只是应用程序逻辑(服务层)和“Web世界”之间的一个浅层接口,允许从Web使用服务层。而且,就我所见,Spring MVC

  • ThinkCMF Api有几个基类控制器,cmf\controller\RestBaseController,cmf\controller\RestUserBaseController,cmf\controller\RestAdminBaseController,基类增加一些统一的方法,和登录认证相关的基础操作。 api 基类控制器 RestBaseController RestBaseContr