【问题标题】:Response to give for partially successful post to Web API对部分成功发布到 Web API 的响应
【发布时间】:2012-06-20 09:09:01
【问题描述】:

如果将一些对象发送到我的 Web api 控制器,插入到我的数据库中,那么最好的响应是什么,其中一些可能成功,一些可能失败?我认为一个正常的 HTTP 响应是不够的 - 找到某种方法来返回一个成功的 JSON 字符串会更好,什么没有?如果是这样,我该怎么做?

我的 Post 控制器如下所示。

感谢您的帮助,

标记

    public HttpResponseMessage PostBooking(Booking[] bookings)
    {
        if (ModelState.IsValid)
        {
            foreach (var booking in bookings)
            {
                // check if there are any bookings already with this HID and RID...
                var checkbooking = db.Bookings.Where(h => h.HID == booking.HID && h.RID == booking.RID).ToList();
                // If so, return a response of conflict
                if (checkbooking.Count != 0 || checkbooking.Any())
                {
                    throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.Conflict));
                }
                else
                {
                    // If not add the booking to the database and return a response of Created
                    db.Bookings.Add(booking);
                    db.SaveChanges();
                }
            } 
            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created);
            return response;
        }
        else
        {
            // Model is not valid, so return BadRquest
            return Request.CreateResponse(HttpStatusCode.BadRequest);
        }
    }

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 asp.net-web-api


    【解决方案1】:

    您可以返回一个 JSON 列表,其中包含未能插入的对象的 ID:

    {
        "failedIds": [
            4,
            7,
            9
        ]
    }
    

    500 HTTP 响应状态代码似乎也合适,因为请求未成功完成。

    您甚至可以更进一步,并解释为什么每个特定 id 的插入失败:

    {
        "failed": [
            {
                "id": 4,
                "reason": "database unavailable"
            },
            {
                "id": 7,
                "reason": "network cable unplugged"
            },
            {
                "id": 9,
                "reason": "a thief is currently running away with our server"
            }
        ]
    }
    

    【讨论】:

    • 嗨 - 我必须创建一个模型,添加 ID/成功/不成功,然后返回吗?那是否需要与 HttpResponseMessage (控制器的第一行)不同的东西来允许发送 JSON 和 HTTP 响应? (谢谢)
    • 是的,您必须创建一个模型。然后return Request.CreateResponse(HttpStatusCode.InternalServerError, modelOfFailedIds);
    • 再一次,你帮助了一个新手,这可能是一个基本的查询 - 谢谢@Darin-Dimitrov - 只要允许,我就会标记为答案。
    • 我不会选择 500。500 意味着服务器错误。在某些情况下,服务器在处理请求时完全没有问题,但业务条件决定了预订不应该成功。 500 实际上会在某些客户端库中引发异常。如果您要采用这种方法,那么 200 更正确。
    • 啊,是的,当然,如果业务条件要求这样做,那么 500 是不合适的。如果存在内部服务器错误,则应使用 500。不幸的是,OP 没有足够详细地解释他的场景以及他所期望的失败类型。
    猜你喜欢
    • 2018-01-08
    • 2021-03-15
    • 2020-04-12
    • 2014-09-14
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-12
    相关资源
    最近更新 更多