zoukankan      html  css  js  c++  java
  • Python3中的http.client模块

    http 模块简介

    Python3 中的 http 包中含有几个用来开发 HTTP 协议的模块。

    • http.client 是一个底层的 HTTP 协议客户端,被更高层的 urllib.request 模块所使用。
    • http.server 包含基于 socketserver 的基本 HTTP 服务器的类。
    • http.cookies 实现 cookie 状态管理
    • http.cookiejar 与 cookie 相关

    http 模块还定义了一系列的 HTTP 状态码。

    HTTPStatus 类是在 Python 3.5 版本中新增的。

    1
    2
    3
    4
    5
    6
    7
    >>> from http import HTTPStatus
    >>> HTTPStatus.OK<HTTPStatus.OK: 200>
    >>> HTTPStatus.OK == 200True
    >>> http.HTTPStatus.OK.value200
    >>> HTTPStatus.OK.phrase'OK'
    >>> HTTPStatus.OK.description'Request fulfilled, document follows'
    >>> list(HTTPStatus)[<HTTPStatus.CONTINUE: 100>, <HTTPStatus.SWITCHING_PROTOCOLS: 101>, ...]

    具体的 HTTP 状态码和相应的说明可以在 Python 的官方文档上找到: https://docs.python.org/3/library/http.html

    http.client 模块

    http.client 模块定义了实现 http 和 https 协议客户端的类。

    该模块通常不会直接使用,而是用封装好的 urllib.request 模块来使用他们处理 URL 。

    常量

    http 模块中的常量:

    1、http.client.HTTP_PORT

    http 协议默认的端口号,总是 80 端口

    2、http.client.HTTPS_PORT

    https 协议默认的端口号,总是 443 端口

    3、http.client.responses

    将 HTTP 1.1 状态码映射到 W3C 名字的字典。

    例如:

    1
    http.client.responses[http.client.NOT_FOUND] is 'Not Found'

    基本类

    HTTPConnection 类

    1
    http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None)

    HTTPConnection 实例表示与 HTTP 服务器的事务。

    实例化 HTTPConnection 时应该传递一个主机和可选的端口号。如果没有传递端口,而主机字符串是以 host:port 的形式,则会提取出端口值,否则将使用默认的 8- 端口。

    如果给定了可选参数 timeout ,阻塞操作将会在给定的时间后超时,若未给定,则使用默认的全局 timeout 设置。

    可选参数 source_address 应该以 host 和 port 的元组形式 (host,port),用来作为 HTTP 连接的源地址。

    示例代码如下:

    1
    2
    3
    >>> h1 = http.client.HTTPConnection('www.python.org')
    >>> h2 = http.client.HTTPConnection('www.python.org:80')>>> h3 = http.client.HTTPConnection('www.python.org', 80)
    >>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)

    source_address 是在 3.2 版本中添加的。

    strict 参数在 3.4 版本中移除了。

    HTTPSConnection 类

    1
    HTTPSConnection(host, port=None, key_file=None, cert_file=None, [timeout, ]source_address=None, *, context=None, check_hostname=None)

    HTTPSConnection 是 HTTPConnection 的子类,使用 SSL 与安全服务器联系。

    默认的端口是 443 端口。如果指定了 context ,必须是 ssl.SSLContext 类的实例来描述不同的 SSL 选项。

    key_file 和 cert_file 已经被弃用了,取而代之的是 ssl.SSLContext.load_cert_chain() 。或者使用 ssl.create_default_context() 选择系统信任的 CA 证书。

    check_hostname 参数也被弃用了,使用 context 的 ssl.SSLContext.check_hostname 属性。

    HTTPResponse 类

    1
    class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None)

    一旦连接成功就会返回该实例,该类的对象不能由用户直接实例化。

    HTTPMessage 类

    HTTPMessage 实例持有从 HTTP response 返回的头部。

    异常类

    HTTPException 类

    Exception 类的子类,也是 http 模块中其他异常类的基类。
    其他异常类:

    • NotConnected
    • InvalidURL
    • UnknownProtocol
    • UnknownTransferEncoding
    • UnimplementedFileMode
    • IncompletedRead
    • ImproperConnectionState
    • BadStatusLine
    • LineTooLong
    • CannotSendRequest
    • CannotSendHeader
    • ResponseNotReady
    • RemoteDisconnected

    类方法

    HTTPConnection 对象方法

    HTTPConnection 实例有如下的方法 :

    1、HTTPConnection.request(method, url, body=None, headers={})

    使用指定的 method 方法和 url 链接向服务器发送请求。

    如果指定 了body 部分,那么 body 部分将在 header 部分发送完之后发送过去。body 部分可以是一个字符串、字节对象、文件对象或者是字节对象的迭代器。不同的 body 类型对应不同的要求。

    header 参数应该是 HTTP 头部的映射,是一个字典类型。

    如果 header 中不包含 Content-Length 项,那么会根据 body 的不同来自动添加上去。

    2、HTTPConnection.getresponse()

    必须在请求发送后才能调用得到服务器返回的内容,返回的是一个 HTTPResponse 实例。

    3、HTTPConnection.set_debuglevel(level)

    设置调试级别,默认调试级别是 0 ,意味着没有调试输出。

    4、HTTPConnection.set_tunnel(host, port=None, headers=None)

    设置 HTTP 隧道链接的主机和端口,这允许连接使用代理服务器。

    5、HTTPConnection.connect()

    连接指定的服务器。默认情况下,如果客户端没有连接,则会在 request 请求时自动调用该方法。

    6、HTTPConnection.close()

    关闭链接。

    7、HTTPConnection.putrequest(request, selector, skip_host=False, skip_accept_encoding=False)

    当和服务器的链接成功后,应当首先调用该方法。

    发送到服务器的内容包括:request 字符串、selector 字符串和 HTTP 协议版本。

    8、HTTPConnection.putheader(header, argument[, …])

    发送 HTTP 头部到服务器。

    发送到服务器的内容包括:header 头部、冒号、空格和参数列表里的第一个。

    9、HTTPConnection.endheaders(message_body=None)

    发送一个空白行到服务器,标识头部的结束。

    10、HTTPConnection.send(data)

    发送数据到服务器。

    应该在 endheaders() 方法之后和在 getresponse() 方法之前调用。

    HTTPResponse 对象方法

    HTTPResponse 实例包含了从服务器返回的 HTTP 回应。

    它提供了访问请求头部和 body 部分的方法。

    HTTPResponse 是一个可迭代的对象而且可以使用 with 语句来声明。

    HTTPResponse 实例有如下的方法 :

    1、HTTPResponse.read([amt])

    读取和返回 response 的 body 部分。

    2、HTTPResponse.readinto(b)

    读取指定的字节长度 len(b),并返回到缓冲字节 b 。

    函数返回读取的字节数

    3、HTTPResponse.getheader(name,default=None)

    返回指定名称 name 的 HTTP 头部值,如果没有相应匹配的 name 值,则返回默认的 None。如果有多个相匹配的,则返回所有的值,以逗号分隔。

    4、HTTPResponse.getheaders()

    以元组的形式返回所有的头部信息 (header,value)。

    5、HTTPResponse.fileno()

    6、HTTPResponse.msg

    7、HTTPResponse.version。

    HTTP 协议版本

    8、HTTPResponse.status

    HTTP 状态码

    9、HTTPResponse.reason

    10、HTTPResponse.debuglevel

    11、HTTPResponse.closed

    如果为 True ,说明连接已关闭。

    示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    import http.client
    import urllib,parser
    # # 初始化一个 https 链接
    conn = http.client.HTTPSConnection("www.python.org")
    # 指定 request 请求的方法和请求的链接地址
    conn.request("GET","/doc/")
    # 得到返回的 http response
    r1 = conn.getresponse()
    # HTTP 状态码
    print(r1.status,r1.reason)
    # HTTP 头部
    print(r1.getheaders())
    # body 部分
    print(r1.read())
    # 如果连接没有关闭,打印输出前 200 个字节
    if not r1.closed:
     print(r1.read(200))
    # 关闭连接后才能重新请求
    conn.close()
    # 请求一个不存在的文件或地址
    conn.request("GET","/parrot.spam")
    r2 = conn.getresponse()
    print(r2.status,r2.reason)
    conn.close()
    # 使用 HEAD 请求,但是不会返回任何数据
    conn = http.client.HTTPSConnection("www.python.org")
    conn.request("HEAD","/")
    res = conn.getresponse()
    print(res.status,res.reason)
    data = res.read()
    print(len(data))
    conn.close()
    # 使用 POST 请求,提交的数据放在 body 部分
    params = urllib.parse.urlencode({'@number':12524,'@type':'issue','@action':'show'})
    # post 请求数据,要带上 Content-type 字段,以告知消息主体以何种方式编码
    headers = {"Content-type":"application/x-www-form-urlencoded","Accept":"text/plain"}
    conn = http.client.HTTPConnection("bugs.python.org")
    conn.request("POST","/",params,headers)
    response = conn.getresponse()
    # 访问被重定向
    print(response.status,response.reason)
    print(response.read().decode("utf-8"))
    conn.close()
  • 相关阅读:
    org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied:
    linux iptables跟service 命令无效解决方法
    eclipse运行C++控制台不输出结果的解决办法
    C#操作mpp文件代码参考
    vs2010 开始执行(不调试) ctrl F5 出现任意键继续
    关于gcc、glibc和binutils模块之间的关系,以及在现有系统上如何升级的总结
    NUnit在Visual Studio 2010中的配置和使用
    【转】从CSDN的趣味题学C# 3.0
    gnome3程序图标下的文字如何改大
    使用autoconf、automake等来制作一个以源代码形式(.tar.gz)发布的软件、并可在执行configure时使用自定义参数
  • 原文地址:https://www.cnblogs.com/jiangzhaowei/p/8999951.html
Copyright © 2011-2022 走看看