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

返回带有BadRequest(WebApi)的错误列表

赫连骏
2023-03-14

如标题所示,如果“模型”不完整,我所要做的就是返回一个自定义错误集合。

虽然我在积极地“搜索/谷歌”,但我还没有找到解决问题的办法。

我可以使用“modelstate”,但是由于“定制”,我想手动这样做。

代码如下:

null

// POST api/<controller>
[HttpPost]
[Route("")]
public async Task<IHttpActionResult> Post([FromBody]Order order)
{
    var modelResponse = new ModelResponse<Order>(order);
    if (order == null)
        return BadRequest("Unusable resource, object instance required.");

    //Check if all required properties contain values, if not, return response
    //with the details
    if (!modelResponse.IsModelValid())
        return this.PropertiesRequired(modelResponse.ModelErrors());

    try
    {
        await _orderService.AddAsync(order);
    }
    catch (System.Exception ex)
    {
        return InternalServerError();
    }
    finally
    {
        _orderService.Dispose();
    }

    return Ok("Order Successfully Processed.");
}

null

public List<string> Messages { get; private set; }
public HttpRequestMessage Request { get; private set; }

public PropertiesRequiredActionResult(List<string> message, 
    HttpRequestMessage request)
{
    this.Messages = message;
    this.Request = request;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
    return Task.FromResult(Execute());
}

public HttpResponseMessage Execute()
{
    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.BadRequest);
    response.Content = new ObjectContent()
        //new List<StringContent>(Messages); //Stuck here
    response.RequestMessage = Request;
    return response;
}

基于自定义属性查找不完整的属性

private T _obj;

public ModelResponse(T obj)
{
    _obj = obj;
}

private Dictionary<string, object> GetPropertyAttributes(PropertyInfo property)
{
    Dictionary<string, object> attribs = new Dictionary<string, object>();
    // look for attributes that takes one constructor argument
    foreach (CustomAttributeData attribData in property.GetCustomAttributesData())
    {

        if (attribData.ConstructorArguments.Count == 1)
        {
            string typeName = attribData.Constructor.DeclaringType.Name;
            if (typeName.EndsWith("Attribute")) typeName = typeName.Substring(0, typeName.Length - 9);
            attribs[typeName] = attribData.ConstructorArguments[0].Value;
        }

    }
    return attribs;
}
private IEnumerable<PropertyInfo> GetProperties()
{
    var props = typeof(T).GetProperties().Where(
            prop => Attribute.IsDefined(prop, typeof(APIAttribute)));

    return props;
}
public bool IsModelValid()
{
    var props = GetProperties();
    return props.Any(p => p != null);
}
public List<string> ModelErrors()
{
        List<string> errors = new List<string>();
        foreach (var p in GetProperties())
        {

            object propertyValue = _obj.GetType()
                .GetProperty(p.Name).GetValue(_obj, null);

            if (propertyValue == null)
            {
                errors.Add(p.Name + " - " + GetPropertyAttributes(p).FirstOrDefault());
            }
        }
        return errors;
}

属性样本

/// <summary>
/// The date and time when the order was created.
/// </summary>
[API(Required = "Order Created At Required")]
public DateTime Order_Created_At { get; set; }

所以忽略后面的两个片段,更多的是给出一个完整的流程概述。我完全理解有一些“开箱即用”的技术,但我确实喜欢创建自己的实现。

说到点子上,有没有可能返回一个带有“BadRequest"的错误列表呢?

非常感谢。

共有3个答案

韩恺
2023-03-14

null

我是这样做的:

public object GetModelStateErrors(ModelStateDictionary modelState)
    {
        var errors = new List<string>();
        foreach (var state in modelState)
        {
            foreach (var error in state.Value.Errors)
            {
                errors.Add(error.ErrorMessage);
            }
        }

        var response = new { errors = errors };

        return response;
    }

正如您所看到的, 是一个函数,它返回一个包含错误集合的字符串数组,并接收 对象以从中获取这些错误。

我是这样实现的:

我用失眠得到的回应是:

{
    "errors": [
        "The Correo field is required.",
        "The Telefono field is required."
    ]
}

希望那会有帮助

太叔永新
2023-03-14

您可能正在寻找使用此方法:

BadRequestObjectResult BadRequest(ModelStateDictionary modelState)

它的用法是这样的,这个例子来自SO中的另一个问题:

if (!ModelState.IsValid)
     return BadRequest(ModelState);

null

{
   Message: "The request is invalid."
   ModelState: {
       model.PropertyA: [
            "The PropertyA field is required."
       ],
       model.PropertyB: [
             "The PropertyB field is required."
       ]
   }
}

null

万俟震博
2023-03-14

httpactionresult ode=""> 的自定义实现中,使用请求创建响应并传递模型和状态代码。

public List<string> Messages { get; private set; }
public HttpRequestMessage Request { get; private set; }

public HttpResponseMessage Execute() {
    var response = Request.CreateResponse(HttpStatusCode.BadRequest, Messages);
    return response;
}
 类似资料:
  • 我正在实现房间数据库。这是我的POJO类 这是DAO类 在运行我的代码时,我收到以下错误

  • 上可用的方法只接受字符串:

  • 问题内容: 我试图按照此链接中的建议将错误返回到对控制器的调用,以便客户端可以采取适当的措施。javascript通过jqueryAJAX调用控制器。仅在不将状态设置为error的情况下,我才可以重新获得Json对象。这是示例代码 如果没有设置状态码,我会得到Json。如果设置状态代码,则会返回状态代码,但不会返回Json错误对象。 更新 我想将Error对象作为JSON发送,以便可以处理ajax

  • 问题内容: 编辑:在这段代码上发生错误: 我正在使用Node js的gmail api。当我阅读他们的快速入门指南时,我会不断收到此错误。 https://developers.google.com/gmail/api/quickstart/nodejs 请记住,我使用电子邮件地址进行了快速入门,一切都很好。完全没有错误。我决定为测试目的创建一个虚拟电子邮件。我所做的唯一更改是关闭了文件以保留新的

  • 下面是我正在使用的一段代码: 期望reponse conatins的状态行:“HTTP/1.1400坏请求”想知道这是可以实现的吗?如果是,那么我如何继续做同样的事情。

  • 基类控制器里有error方法,用于api的错误消息返回输出 /** * 操作错误跳转的快捷方法 * @access protected * @param mixed $msg 提示信息,若要指定错误码,可以传数组,格式为['code'=>您的错误码,'msg'=>'您的错误消息'] * @param mixed $data 返回的数据 * @par