相关疑难解决方法(0)

REST HTTP状态代码,用于验证失败或重复无效

我正在使用基于REST的API构建一个应用程序,并且已经达到了为每个请求指定状态代码的程度.

对于未通过验证的请求或请求尝试在我的数据库中添加副本的情况,我应该发送什么状态代码?

我查看了http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html,但似乎没有一个是正确的.

发送状态代码时是否有通用做法?

rest http http-status-codes

782
推荐指数
8
解决办法
44万
查看次数

基于cookie的身份验证如何工作?

有人可以给我一步一步描述基于cookie的身份验证的工作原理吗?我从未做过涉及身份验证或cookie的任何事情.浏览器需要做什么?服务器需要做什么?按什么顺序?我们如何保证安全?

我一直在阅读有关不同类型的身份验证和关于cookie的信息,但我想要了解如何将两者结合使用的基本描述 - 我只是读到它们经常一起使用但却找不到如何使用的描述.

browser authentication cookies

181
推荐指数
3
解决办法
10万
查看次数

如果用户尝试使用不正确的用户名/密码登录,但格式正确,则返回的HTTP状态代码是什么?

此处发布了一个类似的问题:REST API服务为验证失败返回的适当HTTP状态代码是什么?

上面的线程中的答案指出"例如,如果URI应该具有ISO-8601日期,并且您发现它的格式错误或者指的是2月31日,那么您将返回HTTP 400.如果您期望它同样如此实体主体中格式良好的XML,无法解析."

但是,如果用户提交了正确格式的数据,会发生什么?我的意思是,用户提交了用户名和密码的简单字母字符串/文本(这对我的应用程序完全有效).唯一的问题是密码与用户名不匹配.在这种情况下,400将是不正确的,因为它是完全有效的语法和格式良好.

一个401是不正确的(这里建议:哪个HTTP状态代码说用户名或密码不正确?)因为用户没有尝试访问任何页面,他只是尝试登录并输入不匹配的数据.

如果你回顾我链接的第一篇文章,第二个答案表明422是正确的响应(看起来对我来说是正确的),但是,我使用的是Django Rest Framework而422并不是状态代码的一部分(a可以在此处找到属于DRF的状态代码列表:http://www.django-rest-framework.org/api-guide/status-codes/#client-error-4xx)

404也看起来不正确,因为数据被成功接受而不被拒绝.

话虽如此,应该使用的真正正确答案是什么?

validation rest restful-authentication http-status-codes django-rest-framework

45
推荐指数
4
解决办法
3万
查看次数

REST:将应用程序错误映射到HTTP状态代码

难道要考虑好的做法,以重新使用RFC HTTP状态代码这个样子,或者我们应该组成新的恰好映射到我们具体的错误原因是什么?

我们正在围绕几个遗留应用程序设计一个Web服务API.

除了响应主体中的JSON/XML数据结构之外,我们还希望返回对Web缓存开发人员有意义的HTTP状态代码.

但是,如何将不同类别的错误映射到适当的HTTP状态代码?团队中的每个人都同意以下内容:

如果1234不存在,则GET/package/1234返回404 Not Found

如果"next_checkpoint" 1234有效请求,GET/package/1234/next_checkpoint返回400 Bad Request,但next_checkpont在这里没有意义......

等等......但是,在某些情况下,事情需要比"400"更具体 - 例如:

POST/dispatch /?for_package = 1234返回412 Precondition如果/ dispatch和package 1234都存在则失败,但是1234尚未准备好进行调度.


(编辑:状态代码在HTTP/1.1.在WebDAV的电话分机的状态码)

rest web-services http-status-codes

36
推荐指数
3
解决办法
2万
查看次数

HTTP状态422是否适用于未通过唯一性验证的记录?

我已经做了很多次(看到很多人这样做了),但我开始怀疑它是否合适:

if @record.save
  # status 200
else
  # failure of validations => status 422
end
Run Code Online (Sandbox Code Playgroud)

现在我看到这422 unprocessable entity意味着请求格式正确,但在语义上并不正确.据我了解,验证错误可能不是语义错误.

注意:我在谈论唯一性验证,因此我不确定这是否属于用户错误,如此问题:REST API服务为验证失败返回的适当HTTP状态代码是什么?

总结一下:我应该停止使用状态422吗?如果是这样,我应该使用什么呢?

ruby-on-rails http-status-codes

26
推荐指数
3
解决办法
2万
查看次数

在"验证"服务器中正确使用HTTP状态代码

我的应用程序发送给第三方SOA服务器的数据是复杂的XML.服务器所有者确实提供了XML模式(.xsd),并且由于服务器拒绝无效的XML消息,我需要在发送之前在本地验证它们.

我可以使用独立的XML模式验证器,但它们很慢,主要是因为解析模式文件所需的时间.所以我以HTTP服务器的形式编写了我自己的模式验证器(在Java中,如果这很重要),缓存已经解析的模式.

问题是:在验证过程中很多事情都可能出错.除意外异常和成功验证外:

  • 服务器可能找不到指定的模式文件
  • 指定的文件可能不是有效的模式文件
  • XML对模式文件无效

由于它是HTTP服务器,我想为客户端提供有意义的状态代码.对于上述所有情况,服务器是否应答400错误(错误请求)?或者它们与HTTP无关,它应该在正文中回复200并带有消息?还有其他建议吗?

更新:主应用程序是用Ruby编写的,它没有一个好的xml架构验证库,因此单独的验证服务器不会过度工程.

xml validation xsd http http-status-codes

21
推荐指数
4
解决办法
1万
查看次数

通用故障的HTTP状态代码

我正在寻找一个正确的状态代码,通过api发送gneral失败.

确切的情况是无法将产品添加到购物车.

失败可能由于很多原因而发生,但我想返回一个http代码.

哪个最好?

我一直在浏览它们,并且无法在这里看到任何完全符合需求的东西.

一些可能的失败条件可能是:

Not enough stock to satisfy
Stock limit reached for that particular product
Product no longer available
Run Code Online (Sandbox Code Playgroud)

http http-status-codes

13
推荐指数
1
解决办法
8273
查看次数

身份验证令牌到期的正确 HTTP 代码 - 401 或 403?

401 似乎用于表示身份验证失败,而 403 表示授权失败(这意味着身份验证成功?)在 oauth 流的情况下,如果我尝试使用过期令牌进行身份验证,提示客户端刷新的正确错误代码是什么令牌并重试?

http-authentication

10
推荐指数
3
解决办法
1万
查看次数

我应该使用HTTP 4xx来指示HTML表单错误吗?

我花了20分钟调试一些(django)单元测试.我正在测试一个视图POST,我期待一个302返回代码,之后我断言了一堆数据库实体正如预期的那样.原来最近合并的提交添加了一个新的表单字段,我的测试失败了,因为我没有包含正确的表单数据.

问题是测试失败了,因为HTTP返回代码是200而不是302,我只能通过打印响应HTTP并查看它来解决问题.除了必须通过HTML来解决问题的烦恼之外,200似乎是一个没有得到处理的POST的错误代码.4xx(客户端错误)似乎更合适.此外,它会使测试变得简单,因为响应代码会直接指出我的问题.

我已经读过使用422(不可处理的实体)作为REST API中可能的返回代码,但是在HTML视图/处理程序中找不到任何使用它的证据.

我的问题是 - 是否有其他人这样做,如果没有,为什么不呢?

[ 更新1 ]

只是为了澄清,这个问题与HTML表单有关,而不是API.

这也是关于HTTP响应代码本身的问题 - 而不是Django.这恰好就是我正在使用的东西.我删除了django标签.

[ 更新2 ]

W3C参考文献进一步澄清(http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html):

10.2成功2xx

此类状态代码表示已成功接收,理解和接受客户端的请求.

10.4客户端错误4xx

4xx类状态代码适用于客户端似乎有错误的情况.

10.4.1 400错误请求

由于语法格式错误,服务器无法理解请求.

来自https://tools.ietf.org/html/rfc4918#page-78

11.2. 422不可处理的实体

422(不可处理实体)状态代码表示服务器理解请求实体的内容类型(因此415(不支持的媒体类型)状态代码是不合适的),并且请求实体的语法是正确的(因此400(错误请求) )状态代码不合适)但无法处理包含的指令.例如,如果XML请求主体包含格式正确(即语法正确)但语义错误的XML指令,则可能发生此错误情况.

[ 更新3 ]

深入研究,422是WebDAV扩展[1],这可能解释其默默无闻.也就是说,由于Twitter为了自己的目的使用420,我想我会满足于我想要的任何东西.但它将以4开头.

[ 更新4 ]

关于使用自定义响应代码的说明,以及如何处理它们(如果无法识别),来自HTTP 1.1规范(http://tools.ietf.org/html/rfc2616#section-6.1.1):

HTTP状态代码是可扩展的.HTTP应用程序不需要理解所有已注册状态代码的含义,尽管这种理解显然是可取的.但是,应用程序必须理解任何状态代码的类,如第一个数字所示,并将任何无法识别的响应视为等同于该类的x00状态代码,但不得高速缓存无法识别的响应.例如,如果客户端收到无法识别的状态代码431,则可以安全地假设其请求有问题并将响应视为已收到400状态代码.在这种情况下,用户代理应该向用户呈现随响应返回的实体,因为该实体可能包括将解释异常状态的人类可读信息.

[1] https://tools.ietf.org/html/rfc4918

http

8
推荐指数
1
解决办法
1999
查看次数

HTTP 401未使用HTTP基本身份验证时未授权?

在构建不使用HTTP基本身份验证的REST API (但是其他类似api-key)并且客户端提供无效凭据时,您应该返回什么HTTP状态代码?401未经授权或403禁止?

IANA HTTP状态代码注册地列出了RFC7235,第3.1节的"401未授权",它规定的责任:

生成401响应的服务器必须发送WWW-Authenticate头字段

这是否意味着REST API在使用HTTP基本身份验证时应该只返回401,而不是在例如通过api-key使用身份验证时?

Django 似乎同意:

HTTP 401响应必须始终包含WWW-Authenticate标头,该标头指示客户端如何进行身份验证.HTTP 403响应不包括WWW-Authenticate标头.

将使用的响应类型取决于身份验证方案.

虽然理查森似乎不同意:

401("未经授权")
重要性:高.
客户端尝试在受保护的资源上运行,但未提供正确的身份验证凭据.它可能提供了错误的凭据,或者根本没有.凭证可以是用户名和密码,API密钥或认证令牌 - 无论所讨论的服务是期望的.客户端通常会发出URI请求并接受401,因此它知道要发送什么类型的凭据以及采用何种格式.[...]

authentication rest http-status-codes

5
推荐指数
1
解决办法
6335
查看次数

ASP.NET MVC WebApi 2按令牌登录:如何区分返回码?

我们在web api 2中遇到了新的OWIN auth的一些问题.我们正在开发连接到API服务的移动应用程序,我们需要在登录阶段区分响应.示例:a)错误请求,b)未找到用户,c)密码错误等.

不幸的是,如果我故意发送错误的密码,/ Token端点会返回"错误请求"HTTP响应,因此我无法区分这些情况.

检查Web代码,我认为这是重点(用户为空),我可以决定返回什么样的响应,但是如何?

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();


        User user = await userManager.FindAsync(context.UserName, context.Password);

        if (user == null)
        {
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        }

        ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager,
           OAuthDefaults.AuthenticationType);
        ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager,
            CookieAuthenticationDefaults.AuthenticationType);

        AuthenticationProperties properties = CreateProperties(user.UserName, user.ID);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);
    }
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助;)

c# asp.net-web-api owin asp.net-web-api2

2
推荐指数
1
解决办法
2075
查看次数

HTTP 状态代码。空参数的最佳状态代码是什么?

我正在 Django Rest Framework 中编写一个 API。

我有一个密码重置端点,它接受一个“电子邮件”参数。如果标头中有一个键“email”,但该值是空字符串怎么办?

key: 'email'    
value: ''
Run Code Online (Sandbox Code Playgroud)

我应该返回什么状态代码?400,或者204?

编辑:我忘了提及这不应该是验证失败。该端点不需要授权。这仅用于发送密码重置电子邮件。

api-design http django-rest-framework

1
推荐指数
1
解决办法
4526
查看次数