如何用python中的requests开展HTTP接口请求

前言

现在越来越多的公司都需要自动化的测试人员,那么我们将从以下几个点来讲述一下,作为一个测试人员,该如何学习和了解HTTP请求返回数据:

1)requests环境安装

2)如何发送HTTP请求

3)如何获取接口响应内容

4)获取接口响应状态码

5)获取响应头信息

6)如何处理接口响应异常

7)如何处理接口中的Cookie和Session

8)接口中的重定向处理

9)请求接口时设置超时时间

requests环境安装

用python自带的pip命令进行 requests 依赖包的安装(推荐使用镜像源):

pip install requests -i https://mirrors.aliyun.com/pypi/simple/

安装成功后,可以通过命令进行查看:

pip show requests

查看效果:

如何发送HTTP请求

在目前的工作中,主流的就是两种请求方式 getpost,那么我们来看看该如何用 python 语言中的 requests 库对HTTP进行接口请求。

1)发送 GET 请求

GET 请求是接口测试中最常见的一种请求方式。在许多情况下,通过简单的浏览器访问即可获取数据,但是使用 Python 脚本发送 GET 请求使得我们可以更灵活地处理响应数据,方便自动化测试、数据采集等应用场景。

a. 简单的 get 请求示例:

import requests
​
# 接口请求地址
url = "http://localhost:8080/hello_get"
​
res = requests.get(url=url)

b. 携带参数的 get 请求示例:

import requests
​
# 接口请求地址
url = "http://localhost:8080/admin/hello_get"
​
params = {
    'id': '1'
}
​
res = requests.get(url=url, params=params)

2)发送 POST 请求

在接口测试和数据交互中,POST 请求通常用于向服务器提交数据。通过 Python 中的 requests 库,我们可以方便地发送 POST 请求,并处理响应结果。

a. 简单的 post 请求示例(请求的时候,选择类型为 data ):

import requests
​
url = "http://localhost:8080/admin/login"
data = {'name': 'John', 'age': 25, 'city': 'New York'}
​
response = requests.post(url, data=data)

b. 发送 JSON 数据的 post 请求(请求的时候,选择类型为 json ):

import requests
​
url = "http://localhost:8080/admin/login"
data = {'name': 'John', 'age': 25, 'city': 'New York'}
​
response = requests.post(url, json=data)

如何获取接口响应内容

a. 普通的接口响应内容获取:

content = response.text
print(content)

b. json格式的接口响应内容获取(需要通过 json() 方法解析返回的内容对象):

json_content = response.json()
print(json_content)

获取接口响应状态码

HTTP响应的状态码可以通过response.status_code属性获取。状态码是服务器对请求的处理结果的数字标识。

status_code = response.status_code
print(f"响应的状态码: {status_code}")

HTTP接口的常见状态码解析:
  1. 1xx(信息性状态码)

    • 100 Continue: 表示服务器已经收到了请求的第一部分,正在等待客户端继续发送其余的请求。

    • 101 Switching Protocols: 表示服务器已经理解了客户端的请求,并将通过 Upgrade 消息头通知客户端采用不同的协议。

  2. 2xx(成功状态码)

    • 200 OK: 请求成功。服务器成功地处理了请求。

    • 201 Created: 请求被成功地创建了新的资源。

    • 204 No Content: 服务器成功处理请求,但没有返回任何内容。

  3. 3xx(重定向状态码)

    • 301 Moved Permanently: 请求的资源已经永久移动到新的位置。

    • 302 Found: 请求的资源暂时移动到新的位置。

    • 304 Not Modified: 资源未被修改,可以使用缓存的版本。

  4. 4xx(客户端错误状态码)

    • 400 Bad Request: 服务器无法理解客户端的请求,通常由于客户端发送的请求中有语法错误。

    • 401 Unauthorized: 请求要求身份验证。要求客户端进行身份验证。

    • 403 Forbidden: 服务器已经理解请求,但拒绝执行它。

  5. 5xx(服务器错误状态码)

    • 500 Internal Server Error: 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。

    • 502 Bad Gateway: 服务器作为网关或代理,从上游服务器收到无效的响应。

    • 503 Service Unavailable: 服务器当前无法处理请求,通常由于过载或维护。

获取响应头信息

HTTP响应头包含了一系列关于响应的元信息,如服务器类型、数据类型等。可以通过response.headers属性获取响应头的字典。

headers = response.headers
print(headers)

如何处理接口响应异常

在实际应用中,我们需要考虑到一些异常情况,比如网络不可达、服务器错误等。可以使用response.raise_for_status()来检查是否有HTTP错误发生。

try:
    response.raise_for_status()
    # 用于检查HTTP响应的状态码。如果状态码表明请求不成功,该方法会引发HTTP Error异常
    
except requests.exceptions.HTTPError as errh:  
# 捕获HTTPError异常,如果发生了这种异常,就执行接下来的代码块
    print ("HTTP Error:",errh)
  
except requests.exceptions.ConnectionError as errc:
# 捕获ConnectionError异常,处理连接错误的情况
    print ("Error Connecting:",errc)
  
except requests.exceptions.Timeout as errt:
# 捕获Timeout异常,处理超时错误的情况
    print ("Timeout Error:",errt)
  
except requests.exceptions.RequestException as err:
# 捕获RequestException异常,可以捕获上述以外的其他异常情况
    print ("Oops, Something went wrong:",err)

如何处理接口中的Cookie和Session

Cookie:

定义: Cookie是存储在用户计算机上的小型文本文件,由服务器在每个HTTP请求中发送到客户端,并由浏览器存储。它包含了有关用户的信息,用于跟踪用户的状态。

工作原理: 当用户访问一个网站时,服务器会在响应头中设置一个Set-Cookie头,其中包含了Cookie的信息。浏览器会将这个Cookie保存在用户的本地计算机上。在后续的请求中,浏览器会将相应的Cookie信息自动包含在请求头中,发送给服务器。

特点:

  • 存储在客户端,可以由浏览器禁用或删除。

  • 大小通常受到限制。

  • 可以设置过期时间。

Session:

定义: Session是在服务器端保存的用户信息,通常以键值对的形式存储。每个用户都有一个唯一的会话标识,通过Cookie或URL参数将这个标识传递给客户端。

工作原理: 当用户访问一个需要用户身份验证的页面时,服务器会创建一个唯一的会话标识,并将其发送给客户端(通常通过Cookie)。在后续的请求中,客户端会将这个会话标识带回服务器,服务器通过这个标识来获取或更新用户的会话信息。

特点:

  • 存储在服务器端,客户端只保存了会话标识。

  • 通常不受大小限制。

  • 会话信息在服务器上存储,可以包含更多的用户信息。

区别和关系:
  1. 位置不同: Cookie存储在客户端,而Session存储在服务器端。

  2. 内容不同: Cookie通常包含少量的用户信息,而Session可以包含更多、更敏感的用户信息。

  3. 大小限制: Cookie有大小限制,而Session通常不受限制。

  4. 安全性: 由于Session数据存储在服务器上,相对较安全。Cookie可能会被用户篡改,因此存储在Cookie中的信息应谨慎选择。

1)获取Cookie值

通过response.cookies属性可以获取响应中的Cookie信息。

import requests
​
# 发送HTTP请求
response = requests.get('http://localhost:8080/admin/login')
​
# 获取响应中的Cookie信息
cookies = response.cookies
print(cookies)
​

2)使用Cookie进行后续请求

使用Session对象,可以在多个请求之间保持Cookie,以维持会话状态。

import requests
​
# 创建一个新的会话
session = requests.Session()
​
# 将之前获取的Cookie添加到会话中
session.cookies.update(cookies)
​
# 发送带有Cookie的新请求
new_response = session.get('http://localhost:8080/admin/homepage')
​

3)获取Session值

Session对象会在多个请求之间保持一些参数,比如Cookie。

import requests
​
# 创建一个Session对象
session = requests.Session()
​

4)发送带有Session的请求

使用Session对象发送请求,该对象将在多个请求之间保持一些信息,比如Cookie,以保持会话状态。

import requests
​
# 使用Session对象发送GET请求
response = session.get('http://localhost:8080/admin/homepage1')
​

5)处理响应和Cookie

此时,response.cookies中包含了响应中的所有Cookie信息。

import requests
​
# 处理响应
print(response.text)
​
# 获取响应中的Cookie信息
cookies = response.cookies
​

6)在后续请求中使用Session

Session对象将在后续请求中继续保持之前的状态,包括Cookie等信息。

import requests
​
# 在后续请求中继续使用同一个Session对象
new_response = session.get('https://localhost:8080/new_page')
​

7)关闭Session
import requests
​
# 关闭Session,释放资源
session.close()
​

如果希望自动关闭Session对象,可以使用with语句:

with requests.Session() as session:
    response = session.get('https://example.com')
​

接口中的重定向处理

在接口中,重定向处理是指当服务器收到请求后,不直接返回数据,而是返回一个指示客户端应该向另一个位置重新发起请求的响应。重定向用于将客户端引导到新的UR,比如登录、认证、或者资源的迁移。

常见的重定向状态码有:
  • 301 Moved Permanently: 表示所请求的资源已被分配了新的永久 URI。客户端应该使用新的 URI 重新发起请求。

  • 302 Found: 表示所请求的资源已被暂时的移动到了新的 URI。客户端应该使用新的 URI 重新发起请求,但不要更新书签,因为将来可能还会发生变化。

  • 303 See Other: 表示所请求的资源已经被另一个 URI 处理,但是客户端应该向新的 URI 发送一个 GET 请求。

  • 307 Temporary Redirect: 类似于 302 Found,但要求客户端使用相同的请求方法重新发起请求。

在处理重定向时,客户端通常需要遵循新的URL重新发起请求,然后根据新的响应进行进一步处理。

1)允许或禁止重定向

默认情况下,allow_redirectsTrue,即允许重定向。如果将其设置为False,则请求将不会自动处理重定向,而是返回包含重定向信息的响应对象。

# 允许重定向(默认情况)
response = requests.get(url)
​
# 禁止重定向
response_no_redirect = requests.get(url, allow_redirects=False)

2)处理重定向响应

在允许重定向的情况下,response.url会包含重定向后的最终URL,而在禁止重定向的情况下,response_no_redirect.url会包含发生重定向前的URL。

# 查看重定向前的URL
original_url = response.url
print(f"Original URL: {original_url}")
​
# 查看重定向后的URL
redirected_url = response_no_redirect.url
print(f"Redirected URL: {redirected_url}")
​
# 查看重定向的状态码
status_code = response.status_code
print(f"重定向的状态码: {status_code}")

3)手动处理重定向

在禁止自动重定向的情况下,可以通过检查响应的状态码和查找Location头部来手动处理重定向。

# 手动处理重定向
if response.status_code == 302:
    # 获取重定向的URL
    redirect_url = response.headers['Location']
​
    # 发起新请求
    new_response = requests.get(redirect_url)

4)处理历史重定向信息

如果允许重定向,response.history将包含一个重定向历史列表,每个元素都是一个包含重定向前信息的响应对象。可以遍历这个列表以查看重定向的历史信息。

# 查看重定向历史
redirect_history = response.history
for redirect in redirect_history:
    print(f"Redirected to: {redirect.url}")

请求接口时设置超时时间

在进行HTTP请求时,设置超时时间是一种有效的方式,可以防止请求因为网络延迟或其他原因而导致程序长时间等待。

1)设置超时时间

timeout=5表示请求的最大超时时间为5秒。如果在这个时间内没有得到响应,将引发一个Timeout异常,可以在异常处理中采取适当的措施,例如重试请求或记录日志。

# 设置请求超时时间为5秒
response = requests.get(url, timeout=5)

2)指定超时时间的单位

还可以指定一个元组,其中第一个元素表示连接超时,第二个元素表示读取超时。

# 设置不同的超时时间,比如2秒连接超时和5秒读取超时
response = requests.get(url, timeout=(2, 5))

3)处理超时异常

在发生超时异常时,可以在except requests.exceptions.Timeout块中处理它。这能够更好地应对网络请求超时的情况。

try:
    response = requests.get(url, timeout=5)
    # 使用requests.get方法发送HTTP GET请求,并设置了超时时间为5秒
    
    response.raise_for_status()
    # 检查响应的HTTP状态码,如果状态码表明请求不成功,将引发HTTPError异常
    
except requests.exceptions.Timeout as errt:
# 在规定的时间内未完成(超时),则会捕获requests.exceptions.Timeout异常
    print(f"Timeout Error: {errt}")
    # 可以执行一些处理超时的操作,例如记录日志、重试请求或提供用户友好的错误提示
    
except requests.exceptions.RequestException as err:
# 用于捕获requests库中的所有其他异常
    print(f"Oops, Something went wrong: {err}")
    # 可以处理其他类型的异常,例如连接错误等。打印错误信息是其中一种简单的处理方式

4)全局默认超时时间

还可以在代码的其他地方设置全局默认的超时时间,这样所有的请求都会使用相同的超时时间,除非在请求中显式指定了超时时间。

# 设置全局默认超时时间
requests.DEFAULT_TIMEOUT = 5

结语

那么到这里我们就清楚的知道HTTP请求的一些详细内容,以及如何通过 python 中的 requests 对接口进行请求和相关的处理了,那么我们下次再见👋🏻

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值