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

向调用客户端返回适当的消息

朱起运
2023-03-14

这非常相似,但我的问题不同:对于非OK响应,返回带有IHttpActionResult的内容

考虑到问题不同,我要求一个更简洁的答案,如果存在的话。

我的架构如下:

  1. 对后端控制器的Javascript/jQuery调用
  2. 后端控制器调用WebAPI服务。
  3. WebAPI服务查询数据库(etc)并返回数据

我有以下简化代码(网络 API)...

示例1:如果产品id不存在,则返回错误:

public IHttpActionResult GetProduct(int id)
{
    var product = products.FirstOrDefault((p) => p.Id == id);
    if (product == null)
    {
        return NotFound();
    }
    return Ok(product);
}

示例2如果产品id不存在,则返回空数据:

public IHttpActionResult GetProduct(int id)
{
    var product = products.FirstOrDefault((p) => p.Id == id);
    return Ok(product);
}

客户端JS:

$.getJSON("example.json", function() {
  alert("success");
})
.done(function() { alert('Product retrieved'); })
.fail(function() { alert('Product doesn't exist. '); })
.always(function() { ... });

我已经读了很多很多次,使用异常来控制流是不好的做法,这实际上是如果我使用NotFind()会发生的事情,因为它会击中。失败函数,表明有错误(没有)。

在另一种情况下,当注释必须由插入注释的人以外的人批准时:

public IHttpActionResult ApproveComment(int rowId, string userName)
{
    try {
        return Ok(BusinessLogicLayer.ApproveComment(rowId, userName));
    }
    catch(Exception ex)
    { 
        // elmah.logerr...
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.InnerException == null ? ex.Message : ex.InnerException.Message));
    }
}

BusinessLogicLayer:
public string ApproveComment(int rowId, string userName)
{
    if (userName == _repository.GetInsertedCommentUserName()) {
        return "You cannot approve your own comment.";
    }
    if(_repository.ApproveComment(rowId, userName)){
        return "Comment approved";
    }
}

public string ApproveComment(int rowId, string userName)
{
    if (userName == _repository.GetInsertedCommentUserName()) {
        throw new Exception("You cannot approve your own comment.");
    }
    if(_repository.ApproveComment(rowId, userName)){
        return "Comment approved";
    }
}

在不使用异常的情况下,向用户返回适当消息的干净而优雅的方式是什么?

还是我的想法错了,从用户的角度来看,“特殊”情况是什么?即,“我希望在通过此ID时获得产品退回,但可惜它不存在!从开发人员/测试人员的角度来看,我不认为这将是一个例外情况,但从最终用户的角度来看 - 也许。

共有3个答案

温浩大
2023-03-14

您可以使用HttpResponseMessage自定义响应消息。它允许设置状态代码、原因短语、消息和许多其他内容。

龙毅
2023-03-14

批准您自己的评论-这似乎是一个无效的操作。有一个例外。

这是一个来自客户的坏请求。对此有一个响应状态代码。

如果您按顺序处理异常,那么在代码中出现异常并没有什么错。如果您在客户端优雅地处理它们,给出4xx状态代码也没有错。这是一个不允许客户端发出的请求,所以它应该失败,不是吗?

您的第二个示例与第一个示例不同。在第二个例子中,你肯定会失败。这是一个错误的请求。

第一个例子,好吧,你试图实现一些默认情况下不被禁止的东西 - 获取具有给定ID的记录。而且恰好是这个记录不存在的情况。这是您的商品未找到的情况。

蒋鹏鹍
2023-03-14

你在问两个不同的问题。那么就让我们来一一解答吧。

在第一种情况下,客户端试图访问一个不存在的产品。从服务器返回的适当状态代码是404,not found。对于客户端来说,这实际上是一个例外情况,因为它可能试图访问一个现有的资源。在客户端html" target="_blank">javascript的“失败”部分,您可以检查请求失败的原因(4xx范围=客户端错误,5xx范围=服务器端错误),并向用户显示适当的消息。

对于批准问题,您将返回无用的状态代码。在批准之前,应检查客户机尝试批准的资源是否存在。如果资源不存在,则这是客户端错误,应返回 404,而不是找到。如果业务逻辑层以某种方式更新资源仍然失败,并且这是服务器问题,则应返回 500,内部服务器错误。对于更新失败是客户端错误的任何情况,请返回 4xx 范围内的状态代码。(如403,未经授权,如果不允许客户批准自己的评论)

 类似资料:
  • 我已经使用java nio创建了一个客户端-服务器应用程序,它工作正常,但我的问题是,当服务器有许多连接到服务器的客户端时,服务器会响应错误的客户端,而不是请求客户端。例如,如果客户端A请求第一个人的信息,服务器将第一个人的信息返回给客户端B而不是客户端A。我已经尝试同步对象,但仍然无法正常工作,可能是什么问题。这是我的服务器示例代码

  • 基本上,我希望能够有一个shell脚本,比如: 对于oracle,我只需在sql命令的顶部放置。有mysql的等价物吗?在谷歌没有找到任何东西。

  • 我与Laravel有一个项目,负责管理endpoint调用,并通过Vue控制前端。 当用户登录时,响应(令牌)保存在本地存储中,然后在app.js我将此令牌自动添加到所有调用中。 登录 应用程序。js 现在,我们将看到问题。 当我们转到第二页时,将自动启动endpoint调用以填充一些输入。此调用理论上具有本地存储令牌。 路由(APIendpoint) 头部控制器 这将返回拒绝访问。令牌在标头中被

  • 我在一个基于XML的spring上下文文件中定义了一个骆驼上下文。有一条路由正在由SOAP(XML)web服务客户端bean调用。在调用路由时,它抛出一些异常,客户端接收到骆驼异常,而不是原始异常。 Camel在异常时对客户端的响应如下所示 预期响应应该是任何异常的原始异常消息 这是我的骆驼路线定义 我尝试使用camel onException但没有成功:(

  • 问题内容: 所以现在,我正在制作一个基于客户端服务器应用程序的多线程。在服务器端,我为接受的每个连接创建了一个线程。 在线程类中,我创建了一种将命令发送到客户端的方法。我只想要的是如何将参数发送到所有正在运行的客户端?为简单起见,我只想使此服务器向所有连接的客户端发送消息。 我已经阅读了这篇文章,并从此链接中找到方法。但是,当我尝试使用自己的代码时,中没有类似的方法。 好的,这是我的服务器和线程示

  • 问题内容: 我正在开发一个项目,该项目需要解析一些受保护的网页中的数据。为了获得对这些页面的访问权限,我必须克服SAML身份验证形式(Shibboleth)。是否有人能够在Android(Java)中实现此标准?我已经读过这个线程:Android的SAML客户端实现? 但这并不能给我一个很好的解决方案。实际上,我需要 获取某些受保护网页的数据 以便对其进行解析,而不是让用户看到此类网页的内容。因此