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

C# 我应该在自定义API中返回哪个HttpStatus代码? 脚本,c#,rest,api,C#,Rest,Api,我加入了一个用Java开发API REST的团队。 作为一名.Net开发人员,我正在开发使用该API的客户端,我正在使用RestSharp。 有时我在Java端开发,有时在.Net端开发。 通过分析java代码,我发现当出现问题时,比如异常或失败的业务规则,他们(java程序员)返回HTTP状态代码500(错误)。看看这个例子: try { loteIde = input.getFormDataPart("ideLote", String.class, Class.class);

我加入了一个用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错误

或者,当某些业务实体丢失时,它们返回404HTTP错误(NotFound)。看:

他们找不到实体(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:答案与我的想法一致,并用启示录和鸽子来解释:)


PS2:欢迎更多参考。

您需要编写try-catch if,并在try块中检查是否满足条件返回json格式的数据,否则未找到状态代码 如果数据为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);
            }
        }

您需要编写try-catch-if,并在try块中检查fully-condition是否返回json格式的数据,否则找不到状态代码 如果数据为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);
            }
        }

你是说404错误吗?你的解释有误吗?在第一个代码段中,它们返回400,然后在下一个代码段中,它的404.400用于错误的请求。找不到404。以下是状态代码的列表:。是的,您应该返回状态代码和说明。请参阅此处有关REST状态代码的章节:4xx错误是专门设计用来告诉客户他的请求有问题的,因此如果您正在执行REST(例如,与soap相反),您应该使用它们让他知道。总之,这都是基于意见的,特别是如果它是一个内部项目,你可以自由地以任何你喜欢的方式定义你的规则。@vc74我知道我的状态代码,只是,在他的解释中,我认为他在描述第二个代码段时是指404而不是400。你是指404错误吗?你的解释有误吗?在第一个代码段中,它们返回400,然后在下一个代码段中,它的404.400用于错误的请求。找不到404。以下是状态代码的列表:。是的,您应该返回状态代码和说明。请参阅此处有关REST状态代码的章节:4xx错误是专门设计用来告诉客户他的请求有问题的,因此如果您正在执行REST(例如,与soap相反),您应该使用它们让他知道。总之,这都是基于意见的,特别是如果它是一个内部项目,你可以自由地以任何你喜欢的方式定义你的规则。@vc74我知道我的状态代码,只是,在他的解释中,我认为他在描述第二个代码段时是指404而不是400。这段代码看起来不错,但保留了我发布的Java代码示例中使用的概念,而且,如果这是“默认开发方式”这段代码看起来不错,但保留了我发布的Java代码示例中使用的概念,而且,如果这是“默认开发方式”,它也不会回答