Rest HTTP状态码混淆

Rest HTTP状态码混淆,rest,http,status,Rest,Http,Status,因此,我试图显示有意义和准确的HTTP状态代码,即使在网上浏览了这些示例之后,我仍然感到困惑。我的情况如下: 在接受查询参数的URL中: @POST query Sample URL: /putRecord?Name=A&Age=25&house=permanent 当其中一个参数丢失时,我将返回什么状态代码?(所有3个都是强制性的)-从我读到的,我猜这是一个400:错误的请求。但这似乎太笼统了。我有没有办法说这个查询的格式不正确?资料来源: 假设我根据DB验证了重复的名称,如

因此,我试图显示有意义和准确的HTTP状态代码,即使在网上浏览了这些示例之后,我仍然感到困惑。我的情况如下:

在接受查询参数的URL中:

@POST query
Sample URL: /putRecord?Name=A&Age=25&house=permanent
  • 当其中一个参数丢失时,我将返回什么状态代码?(所有3个都是强制性的)-从我读到的,我猜这是一个400:错误的请求。但这似乎太笼统了。我有没有办法说这个查询的格式不正确?资料来源:
  • 假设我根据DB验证了重复的名称,如果我得到一个重复的名称,我将返回什么状态码
  • 因此,如果已经有重复条目可用,我无法添加记录。我是显示304(未修改)还是仅显示2的错误代码? 澄清:对于3,另一种可能性是当我不能实际提交DB时,我回滚(可能)。现在是什么状态码

    非常感谢


  • 公元1年。除了代码本身(400)外,您还可以返回一条带有说明的短消息。因此,您可以使用“需要400查询参数名称”或类似的内容来响应,而不是重复“400错误请求”。此消息称为“原因短语”,并已定义。或者,如果您需要更大的灵活性,可以返回带有解释的文档

    公元2年。我会考虑使用422个不可处理的实体。从:

    422(不可处理实体)状态代码表示服务器了解请求实体的内容类型,请求实体的语法正确(因此400(错误请求)状态代码不合适),但无法处理包含的指令

    公元3年。我会返回422,但这真的取决于这种情况是否被认为是逻辑上的错误,还是一种常规的、预期的情况

    编辑:正如@War10ck在评论中建议的那样,HTTP 409(代替HTTP 422)也可能有意义


    处理复制品的注意事项(如果我错了请纠正我),如果新的实体已经存在于数据库中,则认为新实体是一个复制品。如果是这样,你也许可以考虑使用HTTP PUT代替HTTP POST?< /P> 您可以定义以下资源:

    HTTP PUT /record/:name
    
    因此,“名称”将是URI的一部分。然后,如果有第二个PUT指向同一个资源(相同的“名称”),那么使用409/422进行响应将是非常优雅的

    如果您对唯一约束使用不同的键,请适当修改URI

    根据经验,POST适用于您可以拥有给定资源的多个实例的情况,即

    HTTP POST /log  ;; Because we have many logs
    
    并针对每个资源都是唯一的情况:

    HTTP PUT /person/:name (or /person/:tax-number if :name isn't unique)
    

    另外,请注意,我已将您的资源从“putRecord”重命名为“record”-PUT是一个HTTP方法,没有理由在URI中也使用它。

    对于#3,您是否也可以使用409:Conflict进行响应,因为在这种情况下,重复会导致冲突?..@War10ck不确定,诚实地说,从未使用过它。但是RFC声明“只有在预期用户能够解决冲突并重新提交请求的情况下才允许使用此代码”-在这种情况下可能有意义。Ok。酷。我不确定。我仍在努力自学所有的密码。谢谢你的回复和很好的回答+是的,谢谢!我对问题进行了编辑,包括对第3条的澄清。你能回答吗?@chipmunk-我在回答中澄清了topis。它不会100%回答您的问题,因为这意味着要为您设计API。相反,希望它能帮助您理解在设计API时应该问自己哪些问题。另外,如果您对这个主题感兴趣,我推荐Richardson和Ruby的“RESTfulWeb服务”。好书。