软件测试入门到精通-第9周-接口自动化测试-requests发送头文件

《用Python玩转HTTP头文件:从菜鸟到黑客的奇幻漂流》

一、当Headers遇上Python:一场数字世界的相亲大会

想象一下,你是个月老(程序员),要给客户端(单身狗)和服务端(傲娇女神)牵线搭桥。没有合适的自我介绍(请求头),女神连门都不会给你开!

典型恋爱…啊不,认证流程:

  1. 第一次约会(登录请求):带着鲜花(用户名)和巧克力(密码)
  2. 女神给你发了个信物(JWT Token)
  3. 之后每次约会都要带着这个信物(Authorization头),否则会被当成跟踪狂(401错误)
    在这里插入图片描述
# 约会的正确姿势
headers = {
    "Authorization": "Bearer your_token_here",  # 相当于"我有对象了"的胸牌
    "Content-Type": "application/json",         # 告诉女神你要用哪种语言表白
    "User-Agent": "Python/3.9 (BoyfriendMaterial/1.0)"  # 你的个人简历
}

## 二、从入门到精通:请求头的十八般武艺

### 1. 基础装备检查(别像个裸奔的原始人)

```python
import requests  # 你的瑞士军刀
import json      # 数字世界的摩斯密码

2. 获取通关文牒(Token获取实战)

新手常犯的错误:

  • 把Token当传单到处发(URL参数)
  • 忘记Bearer前缀(相当于把"亲爱的"说成"喂")
  • 把过期Token当祖传宝贝(Token有效期检查)
正确示范:获取Token的优雅姿势

def get_token():
    response = requests.post(
        "https://api.cupid.com/login",
        json={"username": "Tony", "password": "ILovePython3000"}
    )
    return response.json().get('data', {}).get('token')  # 像拆俄罗斯套娃一样取token

在这里插入图片描述

3. 购物车攻防战(实战演练)

往购物车里塞东西的正确方式

def add_to_cart(product_id, quantity, token):
    headers = {
        "Authorization": f"Bearer {token}",
        "X-Requested-With": "XMLHttpRequest"  # 告诉服务器你不是在刷网页
    }
    
    response = requests.post(
        "https://api.shop.com/cart",
        headers=headers,
        json={
            "product_id": product_id,
            "quantity": quantity,
            "memo": "老板能不能打个折?"  # 附加的甜言蜜语
        },
        timeout=5  # 等待回复的耐心程度
    )
    
    if response.status_code == 200:
        print("成功加入购物车!")
    else:
        print(f"失败原因:{response.json().get('message')}")

三、高级技巧:让你的请求头穿上定制西装

1. 性能优化秘籍

缓存机制:别像个健忘症患者一样每次都重新登录

全局Token管家

class TokenManager:
    _instance = None
    
    def __new__(cls):
        if not cls._instance:
            cls._instance = super().__new__(cls)
            cls._token = None
        return cls._instance
    
    @property
    def token(self):
        if not self._token or self.is_expired():
            self._token = get_fresh_token()
        return self._token

会话保持:像粘人的小奶狗一样保持连接

session = requests.Session()
session.headers.update({
    "Accept-Language": "zh-CN",  # 用中文交流
    "Cache-Control": "no-cache",  # 别给我旧数据
    "X-Custom-Header": "I'm special!"  # 彰显个性
})

2. 安全防护指南

常见翻车现场:

  • 在HTTP上传输Token(相当于用明信片写密码)
  • Token存localStorage(等于把家门钥匙插在门锁上)
  • 使用永不过期的Token(给黑客发终身VIP卡)
    在这里插入图片描述
# 安全典范
headers = {
    "Authorization": f"Bearer {token}",
    "X-Frame-Options": "DENY",  # 防止被iframe攻击
    "Strict-Transport-Security": "max-age=31536000"  # 强制HTTPS
}

四、常见翻车现场救援指南

症状表现可能病因急救方案
401 Unauthorized1. Token过期
2. Bearer拼写错误
3. 忘记带Token
1. 重新登录
2. 检查拼写
3. 检查headers字典
403 Forbidden1. 权限不足
2. IP被ban
3. 缺少必要头信息
1. 检查用户角色
2. 联系管理员
3. 对照API文档
429 Too Many Requests舔狗式频繁请求1. 添加delay
2. 实现请求队列
3. 考虑缓存
在这里插入图片描述

五、企业级骚操作:当Python遇上OAuth2.0

# OAuth2.0舞蹈步骤
auth_url = "https://auth.server.com/oauth/authorize"
token_url = "https://auth.server.com/oauth/token"

# 第一步:获取授权码
redirect_url = "https://your.app/callback"
auth_params = {
    "response_type": "code",
    "client_id": "your_client_id",
    "redirect_uri": redirect_url,
    "scope": "read write",
    "state": "random_string_for_csrf"
}

# 用户会被重定向到认证页面...
# 拿到code后换Token
token_payload = {
    "grant_type": "authorization_code",
    "code": received_code,
    "redirect_uri": redirect_url,
    "client_id": "your_client_id",
    "client_secret": "your_secret"
}

response = requests.post(token_url, data=token_payload)
access_token = response.json()["access_token"]

在这里插入图片描述

六、终极测试:用pytest检验你的求爱技巧

import pytest

@pytest.fixture
def auth_headers():
    token = get_test_token()
    return {
        "Authorization": f"Bearer {token}",
        "X-Test-Env": "true"  # 告诉服务器这是测试,别当真
    }

def test_cart_operations(auth_headers):
    # 测试添加商品
    add_response = requests.post(
        TEST_API + "/cart",
        headers=auth_headers,
        json={"product_id": 1, "quantity": 2}
    )
    assert add_response.status_code == 200
    
    # 测试获取购物车
    get_response = requests.get(
        TEST_API + "/cart",
        headers=auth_headers
    )
    assert len(get_response.json()["items"]) > 0

专业提示:

  • 使用pytest-mock来模拟API响应
  • pytest-html生成带请求头的详细报告
  • 在CI/CD流水线中加入header校验步骤
    在这里插入图片描述

七、彩蛋:那些年我们踩过的坑

  1. 大小写敏感:'Authorization’和’authorization’可能是两个完全不同的东西
  2. 神秘的X-Header:有些API会要求自定义头,比如X-API-KEY
  3. Content-Type陷阱application/jsonapplication/x-www-form-urlencoded会导致完全不同的参数解析
  4. 重定向丢失headers:使用allow_redirects=False或Session对象来处理
  5. 超时设置:永远不要相信网络状况,设置合理的timeout值
# 终极防御性代码示例
try:
    response = requests.post(
        url,
        headers=headers,
        json=data,
        timeout=(3.05, 27),  # 连接超时3秒,读取超时27秒
        allow_redirects=False
    )
    response.raise_for_status()  # 自动检查4xx/5xx错误
    return response.json()
except requests.exceptions.RequestException as e:
    print(f"请求失败: {e}")
    return None

现在,你已经从一个HTTP头文件菜鸟升级成了头文件黑客!记住:好的请求头就像得体的着装——既要符合场合要求,又要彰显个性。祝你编程愉快,API调用顺利!
使用 requests 库发送HTTP请求时,高阶用法主要涉及请求头(headers)的深入配置与管理,这可以显著提高请求的灵活性、安全性和适用性。以下是一些高阶用法的详细说明:

1. 动态构建Headers

在实际应用中,特别是在处理复杂的API或多变的网络环境时,静态headers往往不够用。动态构建headers可以根据不同的请求环境或参数来调整headers。

def create_headers(token, content_type="application/json"):
    headers = {
        "Authorization": f"Bearer {token}",
        "Content-Type": content_type,
        "User-Agent": "Python/3.9"
    }
    return headers

# 使用示例
token = "your_access_token"
headers = create_headers(token)
response = requests.get("https://api.example.com/data", headers=headers)

2. 条件请求

使用条件请求头如 If-None-MatchIf-Modified-Since 可以减少不必要的数据传输,提升应用性能。

headers = {
    "If-None-Match": "etag_from_previous_request",
    "If-Modified-Since": "Wed, 21 Oct 2015 07:28:00 GMT"
}
response = requests.get("https://api.example.com/resource", headers=headers)

if response.status_code == 304:
    print("内容未更改,使用缓存数据")
else:
    print("内容已更新,处理新数据")

3. 接受不同的内容类型

通过修改 Accept 头部,可以指定客户端期望接收的内容类型。

headers = {
    "Accept": "application/xml"  # 默认为 application/json
}
response = requests.get("https://api.example.com/data", headers=headers)

4. 使用自定义Token生成器

在需要频繁刷新Token的应用中,可以使用自定义函数来自动管理Token的生成和刷新。

def get_token():
    # 实现Token获取或刷新的逻辑
    return "new_token"

headers = {
    "Authorization": f"Bearer {get_token()}"
}
response = requests.get("https://api.example.com/secure-data", headers=headers)

5. 处理代理和转发

在使用代理服务器或需要设置转发相关头信息时,可以添加 ForwardedX-Forwarded-For 头部。

headers = {
    "X-Forwarded-For": "client1, proxy1, proxy2"
}
response = requests.get("https://api.example.com/resource", headers=headers)

6. 安全性增强

对于安全性要求较高的应用,可以设置一些安全相关的头部,如 Content-Security-Policy, X-Frame-Options 等来增强安全性。

headers = {
    "Content-Security-Policy": "default-src 'self'",
    "X-Frame-Options": "DENY"
}
response = requests.get("https://secure.example.com", headers=headers)

通过这些高阶用法,可以使得 requests 的使用更加灵活和安全,适应更多的应用场景和需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝花楹下

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值