[接口测试 - http.client篇] 15 常用API说明及基本的示例

概述

在http.client模块中,我们主要使用HTTPConnection和HTTPResponse对象来处理整个HTTP交互过程,所以我们接下里主要介绍以下内容:

  • HTTPConnection
  • HTTPResponse
  • 基本示例

HTTPConnection

先看一下HTTPConnection初始化定义函数

HTTPConnection(host, port=None, [timeout, ] source_address=None) 参数说明 host: 目标服务器IP或url port: 目标服务端口(默认值 http: 80, https: 443), 可选参数 timeout: 超时参数, 可选 source_address: 用于标识链接的来源,格式为(host, port)

一个HTTPConnection实例代表着一个http客户端与服务器端的交互事务,在实例化HTTPConnection时,应该传入目标服务主机(IP或url)和端口,如果没有传递端口,则会从主机字符串中解析端口号(例如www.baidu.com:80,则会尝试从该字符串中去解析出80作为交互端口),如果主机字符串中也无端口号,则使用http.client中定义的默认端口(http: 80, https: 443)。如果给出了可选的超时参数(即timeout),则阻塞操作(如连接尝试)将在许多秒之后超时(如果没有给出,则使用全局缺省超时设置)。

下面看下几种初始化的方式:

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) h5 = http.client.HTTPConnection('www.python.org', 80, timeout=10, source_address=("www.baidu.com", 80) >

下面一起看看HTTPConnection提供出来的API,我们主要对常用的API进行简要说明:

# http链接初始化# 返回一个HTTPConnetion实例对象

HTTPConnection(host, port=None, [timeout, ]source_address=None)

# https链接初始化# 返回一个HTTPSConnection实例对象
HTTPSConnection(host, port=None, key_file=None,     
    cert_file=None, [timeout, ]source_address=None, 
    *, context=None, check_hostname=None)

# 发送http请求
HTTPConnection.request(method, 
    url, 
    body=None, 
    headers={}, *, 
    encode_chunked=False)
    
# 获取返回值,获取到的是一个HTTPResponse实例对象
HTTPConnection.getresponse()

# 设置调试级别,默认为0, 即不输出调试信息
# 用于链接出现问题时,打开调试信息,方便定位
HTTPConnection.set_debuglevel(level)

# 设置HTTP隧道,即运行通过代理服务器运行连接
# 注意这里的host、port指定是目标服务端的host和端口
# 不是代理的host和端口
# 代理的host和端口,应当在初始化时指定
# import http.client
# 代理服务器: localhost, 端口 8080
# conn = http.client.HTTPSConnection("localhost", 8080)
# www.python.org为我们的目标交互服务
# conn.set_tunnel("www.python.org")
# conn.request("HEAD","/index.html")
HTTPConnection.set_tunnel(host, port=None, headers=None)

# 连接到创建对象时指定的服务器。
# 默认情况下,如果客户端尚未有连接,则在发出请求时自动调用此功能。
HTTPConnection.connect()# 关闭连接HTTPConnection.close()

# 向服务器发送RFC 822样式的头。
# 它向服务器发送一条行,包括头、冒号和空格,以及第一个参数。
# 如果给出更多的参数,则会发送延续行,每个行包含一个选项卡和一个参数。
HTTPConnection.putheader(header, argument[, …])

# 向服务器发送一条空行,表示头的尾。
# 可选的messagebody参数可用于传递与该请求相关联的消息体。
HTTPConnection.endheaders(message_body=None, *, 
    encode_chunked=False)
    
# 将数据发送到服务器。
# 在调用endheader()方法和调用getresponse()之前,
# 应该直接使用该方法。
HTTPConnection.send(data)

HTTPResponse

HTTPResponse实例代表着一个从服务器中获得HTTP响应的实例。

它提供对请求头和实体主体的访问。

响应是一个可迭代的对象。

下面我们一起看下其主要的API,并对API进行简要的说明:

# 读取并返回响应主体
HTTPResponse.read()

# 将响应主体的下一个len(b)字节读取到缓冲区b中,
# 返回读取的字节数。
HTTPResponse.readinto(b)

# 返回头名的值,如果没有标题匹配名称,则返回默认值。
# 如果有不止一个带有name名称的头,则返回由''所连接的所有值。
# 如果“default”是除单个字符串以外的任何可迭代的,
#它的元素也会以逗号的方式返回。
HTTPResponse.getheader(name, default=None)

# 返回一个(header, value)元组的列表
HTTPResponse.getheaders()

# 返回服务器使用的HTTP协议版本。
# 10为http/1.0,11为http/1.1。
HTTPResponse.version

# 返回服务器返回的状态码# 例如200
HTTPResponse.status

# 返回服务器返回的reason描述
# 例如 OKHTTPResponse.reason

# 返回流的状态# True表示流已关闭
HTTPResponse.closed

示例

下面我们演示下如何使用http.client进行http的GET、POST、HEAD方法

#-*- coding:utf-8 -*-

__author__ = "苦叶子"

import http.client, urllib.parse

if __name__ == "__main__":
    print("http.client基本示例")

    print("http.client GET方法示例")    
    # 初始化
    conn = http.client.HTTPSConnection("www.python.org")    
    # 发送GET请求
    conn.request("GET", "/")    
    # 获取响应
    r1 = conn.getresponse()    
    # 打印状态码、对应说明、协议版本 
    print(r1.status, r1.reason, r1.version)    
    # 读取整个响应内容
    data1 = r1.read()    
    
    # 下面代码演示如何分chunck读取内容
    conn.request("GET", "/")
    r1 = conn.getresponse()
    while not r1.closed:        
        # 每次读取200bytes
        r1_data = r1.read(200)        
        if len(r1_data) == 0:            
            break
        print(r1_data)    

    # 请求不存在的url    
    conn.request("GET", "/parrot.spam")
    r2 = conn.getresponse()
    print(r2.status, r2.reason)
    data2 = r2.read()    
    # 断开连接
    conn.close()

    print("http.client 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()

    print("http.client POST方法")    
    # 请注意这里设置http headers的方法
    params = urllib.parse.urlencode({'@number': 19999, 
        '@type': 'issue', 
        '@action': 'show'})    
    # http头参数    
    headers = {"Content-type": 
        "application/x-www-form-urlencoded", 
        "Accept": "text/plain"}
    conn = http.client.HTTPConnection("bugs.python.org")    
    # 把请求的data和头参数一起传入
    conn.request("POST", "", params, headers)    
    # 获取响应对象
    response = conn.getresponse()    
    # 打印响应状态
    print(response.status, response.reason)    
    # 读取响应内容
    data = response.read()
    print(data)    
    # 关闭连接
    conn.close()

对于其他方面请参照上述示例进行举一反三。

原文发布于微信公众号 - 开源优测(DeepTest)

原文发表时间:2017-08-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏MongoDB

MongoDB基础概念与事务支持

MongoDB4.0新增了对事务的支持,本文首先介绍一些MongoDB的基础概念,后文会对4.0新增的事务功能进行解读

1.4K200
来自专栏jeremy的技术点滴

Retrying_Library_For_Java

35050
来自专栏xingoo, 一个梦想做发明家的程序员

Java程序员的日常 —— 多进程开发IO阻塞问题

本篇仍旧是源于最近的工作,总结一下纪念那些年埋下的坑... 背景故事 需求:“使用进程方式启动另一个程序!” 开发:“OK! Runtime.getRun...

30050
来自专栏LanceToBigData

JavaWeb(一)Servlet中的request与response

一、HttpServletRequest概述 1.1、HttpServletRequest简介   HttpServletRequest对象代表客户端的请求,当...

30780
来自专栏Jimoer

JVM学习记录-类加载器

JVM设计团队把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外面去实现,以便让应用程序自己决定如何去获取所需要的...

8210
来自专栏土豆专栏

JavaWeb入门之Servlet基础2

开始之前,让我先来介绍一下HTTP协议(hypetext transfer protocol 超文本传输协议),是TCP/IP协议集中的一个应用层协议,用于定于...

589130
来自专栏技术专栏

慕课网Flask构建可扩展的RESTful API-3. 自定义异常对象

因为注册的形式就非常多,所以我们不可能用万能的方式来解决。如果我们不能很好的处理多种多样的形式,我们的代码就会非常的杂乱

15720
来自专栏黑泽君的专栏

day58_BOS项目_10

之前的请假流程,是没有实际意义的,我们要使得我们流程变得有意义(有实际意义),需要在流程向下推进的过程中带着数据推进才有意义。如下图所示:

10840
来自专栏码神联盟

面试题 | 《Java面试题集》-- 第三套

varchar2分别在oracle的sql和pl/sql中都有使用,oracle 在sql参考手册和pl/sql参考手册中指出:oracle sql varch...

17120
来自专栏枕边书

PHP模拟发送POST请求之二、用PHP和JS处理URL信息

明白了HTTP请求的头信息后,我们还需要对请求地址有所了解。再者,HTTP GET请求是靠URL实现的,所以了解URL的构造,处理URL的重要性不言而喻。 在P...

24150

扫码关注云+社区

领取腾讯云代金券