如何检查 401 的 HTTP 状态代码?

Posted

技术标签:

【中文标题】如何检查 401 的 HTTP 状态代码?【英文标题】:How to check for an HTTP status code of 401? 【发布时间】:2010-12-26 11:31:23 【问题描述】:

In one of the answers that I have received here,我遇到了一个问题,不知道如何通过“Google App Engines”自动将我的 ID 和密码传递到我是注册用户并拥有帐户的网站。有人建议我“检查 HTTP 状态代码 401,“需要授权”,并提供网站要求的那种 HTTP 授权(基本、摘要等)”。我不知道如何检查状态码。谁能告诉我怎么做?

++++++++++++++++++++++++++++++++++++

附加信息:

如果我在 Google App Engine 中使用这种方式(获取我的 eBay 摘要页面的 url):

from google.appengine.api import urlfetch
url = "http://my.ebay.com/ws/eBayISAPI.dll?MyEbay&gbh=1&CurrentPage=MyeBaySummary&ssPageName=STRK:ME:LNLK"
result = urlfetch.fetch(url)
if result.status_code == 200:
   print "content-type: text/plain"
   print
   print result.status_code

我总是得到“200”而不是“401”

【问题讨论】:

【参考方案1】:

除非我不完全理解您的问题,否则您可以使用 status_code 属性从 Response Object 获取返回码。

首先,您必须向要测试的 URL 发出 fetch()。

【讨论】:

你好 jldupont!!!谢谢你的回复。如果我使用你建议的方式,我总是得到 200 号,这就是我得到的全部。请检查上面我刚刚添加到此问题主要字段中的代码。 hmmm...您指的是经过身份验证的请求吗?您需要在请求的标头中提供信息。 fetch() 函数允许设置标题字段。 谢谢你,jldupont!我会花一些时间研究它。 jldupont,我试过了,但又遇到了错误。如果您有时间和欲望,请到那里看看:***.com/questions/1912845/… @brilliant:回溯是关于语法错误。它是否与您使用反引号`而不是通常的记号'或"有关?【参考方案2】:

在普通的 Python 代码中,我可能会使用较低级别的httplib,例如:

import httplib

domains = 'google.com gmail.com appspot.com'.split()

for domain in domains:
  conn = httplib.HTTPConnection(domain)
  conn.request('GET', '/')
  resp = conn.getresponse()
  print 'Code %r from %r' % (resp.status, domain)

这将显示301(永久移动)和302(临时移动)等代码; urllib2 等更高级别的库会为您“在幕后”处理此类事情,这很方便,但让您更难以简单地控制(您必须安装自己的“url opener”对象等)。

在 App Engine 中,您最好使用 urlfetch,它会返回带有 status_code 属性的 response object。如果该属性为 401,则意味着您需要在标头中重复获取 with 适当类型的授权信息。

不过,App Engine 现在也支持 urllib2,因此如果您对使用这种更高级别的抽象感到满意,您可以将工作委托给它。有关如何将基本身份验证委托给 urllib2 的教程,请参阅here,有关基本身份验证如何工作的更一般的教程,请参阅here(我相信即使您了解较低抽象层发生的事情也会对您有所帮助重新使用更高的层!-)。

【讨论】:

Alex,感谢您再次回答。 (1)“...如果那个属性是401,那就意味着你需要重复...” - 我一直得到“200”(请检查上面我刚刚添加到这个问题的主要字段的代码) ; (2) 感谢您的链接。我现在正在研究它们; Alex,我刚刚尝试通读了您在此处提供的这两个链接,这对我来说有点不知所措。我想我会坚持 AppEngine-urlfetch 的方式。 @brilliant,你得到 200 正是因为 urllib2 代表你在“幕后”做事;这很方便,但会使理解和控制变得更加困难。对于带有 urlfetch 的简单基本身份验证(希望您不需要更高级的摘要身份验证),请参阅chillorb.com/?p=195(包括 simpx 的评论,它是使事情正常工作所必需的;-)。 感谢 Alex 提供此链接。我会花一些时间研究它。 你好亚历克斯!!!我刚刚在这里问了另一个关于使用你的代码的问题:***.com/questions/1912845/… 所以,如果你有时间和意愿,请查一下。【参考方案3】:

大多数面向用户的网站不使用 HTTP 身份验证,而是使用基于 cookie 的身份验证,并使用 html 表单进行登录。如果您想在自己的代码中复制此内容,则需要向相关应用程序的登录 URL 发出 HTTP POST 请求,并捕获发回的 cookie,包括您未来所有验证自己的请求中的 cookie。如果没有有关您尝试对其进行身份验证的特定网站的更多详细信息,就很难更具体。

【讨论】:

感谢尼克,您的意见。我会花一些时间查看 Alex 提供的材料,然后再详细说明。【参考方案4】:

您没有收到 401,因为该网站没有返回 401,而是始终返回 200。通常我们为网站做的编码类型是返回 200,页面上写着“请登录..blah blah”,如果网站返回任何其他内容,那么 200 浏览器将不会显示时髦的错误消息。

简而言之,正如我在其他问题中提到的,您需要查看登录页面,查看它使用的参数,例如 login=xxx、password=yyy,将其发布到该页面,您也必须管理 cookie,这就是像斜纹布等库出现的地方。

【讨论】:

谢谢你,Anurag Unival!我有点害怕这种不得不处理 cookie 的可能性,但你的这个回答给了我一些希望。 Anurag,这是您建议的延续。如果您有时间和欲望,请查看:***.com/questions/1914275/…

以上是关于如何检查 401 的 HTTP 状态代码?的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS HTTP 标头配置。预检响应具有无效的 HTTP 状态代码 401

预检响应具有无效的 HTTP 状态代码 401 - Spring

Angular 2 - 预检响应具有无效的 HTTP 状态代码 401

php--------http 状态代码及其原因

无法加载 http://localhost:9999/auth-service/oauth/token:预检响应具有无效的 HTTP 状态代码 401

通过基本身份验证访问 REST 的 Angular2 抛出“预检响应具有无效的 HTTP 状态代码 401”