我应该在自定义API中返回哪个HttpStatus代码?

时间:2017-08-30 13:16:50

标签: c# rest api

方案

我加入了一个正在开发Java的API REST的团队。 作为.Net开发人员,我正在开发使用该API的客户端,我正在使用RestSharp。 有时我在Java方面开发,有时在.Net方面开发。 分析java代码,我发现当出现问题时,如异常或失败的业务规则,他们(Java编码器)返回HTTP状态代码500(错误)。看这个例子:

try {
        loteIde = input.getFormDataPart("ideLote", String.class, Class.class);
    } catch (IOException e) {
        return Response.status(400).entity(errorHandler.getJsonError(ErrorMsgs.ERRO_INTERNO)).build();
    }

在上面的例子中,如果客户端(API调用者)没有传递参数" ideLote"对于请求,他们返回400错误。

否则,当缺少某些业务实体时,它们会返回404 HTTP错误(NotFound)。看:

Lote lote = loteDAO.findById(loteIde);
if (lote == null) {
    return Response.status(404).entity(errorHandler.getJsonError(ErrorMsgs.NAO_POSSIVEL_IDENTIFICAR_LOTE)).build();
}

他们无法找到实体(Lote),因此他们返回了400 HTTP状态错误。

在我的构思中,HTTP状态表示HTTP请求的状态,而不是某些商务规则的状态,因此,在这两种情况下,它们都应该返回200个HTTP状态代码(没有错发生在Http请求中,以及其他一些关于业务规则中发生的事情的信息(可能是XML或JSON),例如,他们可能会给我这样的信息:

{
    "IdCertificado": null,
    "Errors": [
    {
       "Codigo": "0001",
       "Mensagem": "You should inform the ideLote property"
    }],
    "TemErro": true
}

问题

我的观念错了吗?什么应该是Web API的默认行为

PS1:this回答同意我的观念并使用启示录和鸽子来解释它:)。

PS2:欢迎提供更多参考资料。

1 个答案:

答案 0 :(得分:-2)

你需要编写try catch如果和在try块中你需要检查是否满足条件以json格式返回数据否则找不到状态代码 如果data为null则返回异常 我认为你可以很容易地给出代码

        [HttpGet]
        public HttpResponseMessage GetNote(string ExamId, string QuestionId)
        {

            try
            {
                decimal exid = Convert.ToDecimal(ExamId);
                decimal qid = Convert.ToDecimal(QuestionId);

                var temp = new MemberQuestionsRepository().FirstOrDefault(x => x.MemberExamId == exid && x.QuestionId == qid);
                if (temp != null)
                {
                    var note = temp.Note;
                    return Request.CreateResponse(HttpStatusCode.OK, note);
                }
                else
                {
                    return Request.CreateResponse(HttpStatusCode.NotFound, "No Note Found");
                }
            }
            catch (Exception)
            {

                return Request.CreateResponse(HttpStatusCode.ExpectationFailed);
            }
        }