【问题标题】:How to get HTTP status message in (py)curl?如何在(py)curl中获取HTTP状态消息?
【发布时间】:2011-02-13 00:02:34
【问题描述】:

花了一些时间研究 pycurl 和 libcurl 文档,我仍然找不到(简单)方法,如何在 pycurl 中获取 HTTP 状态消息(原因短语)。

状态码很简单:

import pycurl
import cStringIO

curl = pycurl.Curl()
buff = cStringIO.StringIO()
curl.setopt(pycurl.URL, 'http://example.org')
curl.setopt(pycurl.WRITEFUNCTION, buff.write)
curl.perform()

print "status code: %s" % curl.getinfo(pycurl.HTTP_CODE)
# -> 200

# print "status message: %s" % ???
# -> "OK"

【问题讨论】:

    标签: python libcurl pycurl http-status


    【解决方案1】:

    这是一个旧线程,但我来这里是为了寻找类似的信息。如果只是您要查找的状态码,例如 200、404、500 等,那么只需执行以下操作:

    your_curl_handle.getinfo(pycurl.RESPONSE_CODE)

    应该返回一个数字状态码:)

    【讨论】:

    • 这是检查状态码的正确方法
    • 我收到pycurl.error: cannot invoke getinfo() - no curl handle 错误。
    【解决方案2】:

    我认为您可以使用 human_curl 库来创建简单的代码。

    >>> import human_curl as hurl
    >>> r = hurl.get('http://example.org')
    >>> print r.status_code
    200
    

    您可以在 https://github.com/Lispython/human_curl 上获取有关 human_curl 的完整文档

    【讨论】:

    • "reason-phrase" 是 HTTP 协议文档使用的一个术语,用于指代 status_code 之后的人类可读字符串。此示例仅返回数字状态代码。
    【解决方案3】:

    我自己找到了一个解决方案,它可以满足我的需要,但可能更强大(适用于 HTTP)。

    这是基于pycurl.HEADERFUNCTION获取的捕获头包含状态行的事实。

    import pycurl
    import cStringIO
    import re
    
    curl = pycurl.Curl()
    
    buff = cStringIO.StringIO()
    hdr = cStringIO.StringIO()
    
    curl.setopt(pycurl.URL, 'http://example.org')
    curl.setopt(pycurl.WRITEFUNCTION, buff.write)
    curl.setopt(pycurl.HEADERFUNCTION, hdr.write)
    curl.perform()
    
    print "status code: %s" % curl.getinfo(pycurl.HTTP_CODE)
    # -> 200
    
    status_line = hdr.getvalue().splitlines()[0]
    m = re.match(r'HTTP\/\S*\s*\d+\s*(.*?)\s*$', status_line)
    if m:
        status_message = m.groups(1)
    else:
        status_message = ''
    
    print "status message: %s" % status_message
    # -> "OK"
    

    【讨论】:

      【解决方案4】:

      试试 BaseHTTPServer.BaseHTTPRequestHandler.responses,它应该包含错误代码字典,如 this page 中所述。

      希望这会有所帮助。

      【讨论】:

      • 这是一个可能的解决方案.. 我应该指出,我想从服务器获得状态消息,这可能与标准化的不同
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2017-12-22
      相关资源
      最近更新 更多