Requests库

构建HTTP请求

构建请求URL参数

https://www.baidu.com/s?wd=iphone&rsv_spt=1

问号后面的部分 wd=iphone&rsv_spt=1 就是 url 参数,每个参数之间是用 & 隔开的。

但是有的时候,我们的url参数里面有些特殊字符,比如 参数的值就包含了 & 这个符号。

那么我们可以把这些参数放到一个字典里面,然后把字典对象传递给 Requests请求方法的 params 参数,如下

urlpara = {
    'wd':'iphone&ipad',
    'rsv_spt':'1'
}

response = requests.get('https://www.baidu.com/s',params=urlpara)

构建请求消息头

每个消息头也就是一种 键值对的格式存放数据,如下所示

user-agent: my-app/0.0.1
auth-type: jwt-token
headers = {
    'user-agent': 'my-app/0.0.1', 
    'auth-type': 'jwt-token'
}
r = requests.post("http://httpbin.org/post", headers=headers)
print(r.text)

构建请求消息体

Web API接口中,消息体基本都是文本,文本的格式主要是这3种: urlencoded ,json , XML。

XML 格式消息体

如果设计者决定用 XML 格式传输一段信息,用Requests库,只需要这样

payload = '''


    良好
    30%
    暂无

'''

r = requests.post("http://httpbin.org/post",
                  data=payload.encode('utf8'))
print(r.text)

urlencoded 格式消息体

这种格式的消息体就是一种 键值对的格式存放数据,如下所示

key1=value1&key2=value2

然后使用post方法的时候,指定参数 data 的值为这个字典就可以了,如下

payload = {'key1': 'value1', 'key2': 'value2'}

r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)

json 格式消息体

可以使用json库的dumps方法,如下

import requests,json

payload = {
    "Overall":"良好",
    "Progress":"30%",
    "Problems":[
        {
            "No" : 1,
            "desc": "问题1...."
        },
        {
            "No" : 2,
            "desc": "问题2...."
        },
    ]
}

r = requests.post("http://httpbin.org/post", data=json.dumps(payload))

也可以将 数据对象 直接 传递给post方法的 json参数,如下

r = requests.post("http://httpbin.org/post", json=payload)

检查HTTP响应

检查响应状态码

要检查 HTTP 响应 的状态码,直接 通过 reponse对象的 status_code 属性获取

import requests

response = requests.get('http://mirrors.sohu.com/')
print(response.status_code)

检查响应消息头

要检查 HTTP 响应 的消息头,直接 通过 reponse对象的 headers 属性获取

import requests,pprint

response = requests.get('http://mirrors.sohu.com/')

print(type(response.headers))

pprint.pprint(dict(response.headers))

运行结果如下

<class 'requests.structures.CaseInsensitiveDict'>
{'Cache-Control': 'no-store',
 'Connection': 'keep-alive',
 'Content-Type': 'text/html; charset=utf8',
 'Date': 'Sat, 21 Sep 2019 09:02:32 GMT',
 'Server': 'nginx',
 'Transfer-Encoding': 'chunked'}

response.headers 对象的类型 是 继承自 Dict 字典 类型的一个 类。

我们也可以像操作字典一样操作它,比如取出一个元素的值

print(response.headers['Content-Type'])

检查响应消息体

获取响应的消息体的文本内容,直接通过response对象 的 text 属性即可获取

import requests

response = requests.get('http://mirrors.sohu.com/')
print(response.text)

但是有时候,服务端并不一定会在消息头中指定编码格式,这时, requests的推测可能有误,需要我们指定编码格式。

可以通过这样的方式指定

import requests

response = requests.get('http://mirrors.sohu.com/')
response.encoding='utf8'
print(response.text)

如果我们要直接获取消息体中的字节串内容,可以使用 content 属性,

比如

import requests

response = requests.get('http://mirrors.sohu.com/')
print(response.content)

当然,如果可以直接对 获取的字节串 bytes对象进行解码

print(response.content.decode('utf8'))

session机制

requests库给我们提供一个 Session 类 。通过这个类,无需我们操心, requests库自动帮我们保存服务端返回的 cookie数据, HTTP请求自动 在消息头中放入 cookie 数据。

import requests

# 打印HTTP响应消息的函数
def printResponse(response):
    print('\n\n-------- HTTP response * begin -------')
    print(response.status_code)

    for k, v in response.headers.items():
        print(f'{k}: {v}')

    print('')

    print(response.content.decode('utf8'))
    print('-------- HTTP response * end -------\n\n')


# 创建 Session 对象
s = requests.Session()

# 通过 Session 对象 发送请求
response = s.post("http://127.0.0.1/api/mgr/signin",
       data={
           'username': 'byhy',
           'password': '88888888'
       })

printResponse(response)

# 通过 Session 对象 发送请求
response = s.get("http://127.0.0.1/api/mgr/customers",
      params={
          'action'    :  'list_customer',
          'pagesize'  :  10,
          'pagenum'   :  1,
          'keywords'  :  '',
      })

printResponse(response)

你可能感兴趣的:(自动化测试,pytest)