当前位置: 首页 > 开发者资讯

Python如何发送 HTTP 请求? requests 库常用方法有哪些?

  在 Python 开发中,发送 HTTP 请求是实现接口调用、数据爬取、服务交互的核心需求 —— 无论是调用第三方 API(如天气接口、支付接口),还是与后端服务通信,都需要通过 HTTP 协议传递数据。Python 内置的urllib库虽能实现基础请求,但语法繁琐;而第三方库requests以简洁的 API、完善的功能成为主流选择。本文将从 HTTP 请求基础入手,详解requests库的安装、常用方法及实战技巧,帮助你高效实现 HTTP 交互。

  一、HTTP 请求基础:理解核心概念

  在使用requests库前,需先明确 HTTP 请求的核心要素,确保后续操作符合协议规范:

  请求方法:常见类型包括 GET(获取资源)、POST(提交资源)、PUT(更新资源)、delete(删除资源),不同方法对应不同的业务场景;

  请求 URL:目标资源的地址(如https://api.example.com/weather);

  请求头(Headers):包含客户端信息(如浏览器标识、数据格式),部分接口需通过请求头验证身份(如Authorization令牌);

  请求参数:GET 请求的参数通常拼接在 URL 后(如?city=beijing&date=20250828),POST 请求的参数多放在请求体(Body)中,格式可分为表单(Form Data)、JSON 等;

  响应:服务器返回的结果,包含状态码(如 200 表示成功、404 表示资源不存在)、响应头、响应体(业务数据,多为 JSON 或 HTML 格式)。

  二、requests 库的安装与基础使用

  requests是 Python 第三方库,需先安装才能使用,其核心优势是 “语法简洁、功能全面”,支持所有 HTTP 请求方法,且自动处理 Cookie、会话保持等细节。

  (一)安装 requests 库

  通过 Python 包管理工具pip安装,命令如下(适用于 Windows、Linux、Mac):

  TypeScript取消自动换行复制

  pip install requests

  安装完成后,在 Python 脚本中导入库即可使用:

  TypeScript取消自动换行复制

  import requests

  (二)基础请求流程

  使用requests发送 HTTP 请求的通用流程为:

  构造请求参数(URL、方法、 headers、参数等);

  调用requests对应的方法发送请求;

  解析响应结果(状态码、响应体等)。

  示例:发送最简单的 GET 请求,获取百度首页内容

  TypeScript取消自动换行复制

  import requests

  # 1. 发送GET请求

  response = requests.get("https://www.baidu.com")

  # 2. 解析响应

  print("状态码:", response.status_code) # 输出:200(表示请求成功)

  print("响应体前100字符:", response.text[:100]) # 输出HTML内容片段

python4.png

  三、requests 库常用方法及实战示例

  requests库为不同 HTTP 请求方法提供了对应的函数,核心常用方法包括get()、post()、put()、delete(),其中get()和post()覆盖 80% 以上的业务场景。

  (一)GET 请求:获取资源(requests.get())

  GET 请求用于从服务器获取资源,参数通常通过 URL 传递,适用于查询数据(如获取天气、查询用户信息)。

  1. 基础用法:带 URL 参数的 GET 请求

  若需传递参数(如查询 “北京” 的天气),可通过params参数传入字典,requests会自动将参数拼接为 URL 查询字符串(?city=北京&key=xxx)。

  示例:调用模拟天气 API 获取北京天气

  TypeScript取消自动换行复制

  import requests

  # 1. 配置请求参数

  url = "https://api.example.com/weather" # 目标API地址

  params = {

  "city": "北京", # 查询的城市

  "key": "abc123" # API密钥(通常由接口提供方分配)

  }

  # 2. 发送GET请求

  response = requests.get(url, params=params)

  # 3. 解析响应(假设响应体为JSON格式)

  if response.status_code == 200: # 200表示请求成功

  weather_data = response.json() # 将JSON响应体转为Python字典

  print("城市:", weather_data["city"])

  print("温度:", weather_data["temp"])

  print("天气:", weather_data["desc"])

  else:

  print(f"请求失败,状态码:{response.status_code}")

  2. 进阶用法:自定义请求头

  部分 API 要求在请求头中携带客户端信息(如User-Agent模拟浏览器,Authorization传递令牌),可通过headers参数配置。

  示例:带自定义 headers 的 GET 请求

  TypeScript取消自动换行复制

  import requests

  url = "https://api.example.com/user/123" # 查询ID为123的用户信息

  headers = {

  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0", # 模拟Chrome浏览器

  "Authorization": "Bearer abcdef123456" # 身份令牌(JWT格式)

  }

  response = requests.get(url, headers=headers)

  if response.status_code == 200:

  print("用户信息:", response.json())

  (二)POST 请求:提交资源(requests.post())

  POST 请求用于向服务器提交数据(如提交表单、创建用户、上传文件),参数通常放在请求体中,安全性高于 GET(参数不暴露在 URL 中)。requests.post()支持多种请求体格式,最常用的是 “表单数据” 和 “JSON 数据”。

  1. 提交表单数据(Form Data)

  适用于模拟 HTML 表单提交(如登录、注册),需将参数通过data参数传入字典,requests会自动设置请求头Content-Type: application/x-www-form-urlencoded。

  示例:模拟用户登录(提交用户名和密码)

  TypeScript取消自动换行复制

  import requests

  url = "https://api.example.com/login" # 登录接口地址

  data = {

  "username": "test_user",

  "password": "123456"

  }

  # 发送POST请求,提交表单数据

  response = requests.post(url, data=data)

  if response.status_code == 200:

  result = response.json()

  print("登录结果:", result["message"])

  print("登录令牌:", result["token"]) # 登录成功后获取的身份令牌,后续请求需携带

  else:

  print("登录失败:", response.text)

  2. 提交 JSON 数据(JSON Payload)

  适用于前后端分离项目的 API 交互(如创建订单、更新用户信息),需将参数通过json参数传入字典,requests会自动设置请求头Content-Type: application/json,并将字典转为 JSON 字符串。

  示例:创建新用户(提交 JSON 格式数据)

  TypeScript取消自动换行复制

  import requests

  url = "https://api.example.com/users" # 创建用户的接口

  headers = {

  "Authorization": "Bearer abcdef123456" # 需携带登录后的令牌

  }

  user_data = {

  "name": "张三",

  "age": 25,

  "email": "zhangsan@example.com"

  }

  # 发送POST请求,提交JSON数据

  response = requests.post(url, headers=headers, json=user_data)

  if response.status_code == 201: # 201表示资源创建成功

  new_user = response.json()

  print("新用户ID:", new_user["id"])

  print("创建时间:", new_user["create_time"])

  3. 上传文件(Multipart/Form-Data)

  若需上传文件(如图片、文档),需通过files参数传入字典,requests会自动设置请求头Content-Type: multipart/form-data,适用于头像上传、文件提交等场景。

  示例:上传图片文件

  TypeScript取消自动换行复制

  import requests

  url = "https://api.example.com/upload" # 文件上传接口

  headers = {

  "Authorization": "Bearer abcdef123456"

  }

  files = {

  # "file"为接口要求的参数名,open()打开文件,指定文件类型(image/jpeg)

  "file": ("test.jpg", open("test.jpg", "rb"), "image/jpeg")

  }

  # 发送POST请求,上传文件

  response = requests.post(url, headers=headers, files=files)

  if response.status_code == 200:

  upload_result = response.json()

  print("文件URL:", upload_result["file_url"]) # 上传后文件的访问地址

  (三)其他常用方法:PUT、delete

  除 GET 和 POST 外,requests还支持 PUT(更新资源)、delete(删除资源)等方法,用法与 GET/POST 类似,仅需调用对应的函数并传递参数。

  1. PUT 请求:更新资源(requests.put())

  适用于全量更新资源(如修改用户的所有信息),参数传递方式与 POST 类似(支持data或json)。

  示例:更新用户信息(全量更新)

  TypeScript取消自动换行复制

  import requests

  url = "https://api.example.com/users/123" # 要更新的用户ID为123

  headers = {

  "Authorization": "Bearer abcdef123456"

  }

  update_data = {

  "name": "张三_更新",

  "age": 26,

  "email": "zhangsan_update@example.com"

  }

  # 发送PUT请求,更新用户信息

  response = requests.put(url, headers=headers, json=update_data)

  if response.status_code == 200:

  print("更新结果:", response.json()["message"]) # 输出:"用户信息更新成功"

  2. delete 请求:删除资源(requests.delete())

  适用于删除资源(如删除用户、删除订单),通常仅需传递 URL 和必要的请求头(如身份令牌)。

  示例:删除用户(ID 为 123)

  TypeScript取消自动换行复制

  import requests

  url = "https://api.example.com/users/123" # 要删除的用户ID为123

  headers = {

  "Authorization": "Bearer abcdef123456"

  }

  # 发送delete请求,删除用户

  response = requests.delete(url, headers=headers)

  if response.status_code == 204: # 204表示资源删除成功,无响应体

  print("用户删除成功")

  else:

  print("删除失败:", response.text)

  四、requests 库的进阶技巧

  在实际开发中,还需处理超时控制、会话保持、异常捕获等场景,requests提供了对应的功能满足需求。

  (一)设置请求超时

  为避免请求因网络问题长期阻塞,可通过timeout参数设置超时时间(单位:秒),超时后会抛出requests.exceptions.Timeout异常。

  示例:设置 5 秒超时

  TypeScript取消自动换行复制

  import requests

  try:

  response = requests.get("https://api.example.com/weather", params={"city": "北京"}, timeout=5)

  print("请求成功")

  except requests.exceptions.Timeout:

  print("请求超时,需检查网络或接口状态")

  (二)会话保持(Session)

  若需多次请求同一域名(如登录后多次调用接口),使用requests.Session()可保持会话状态(自动保存 Cookie),避免每次请求都重新验证身份,提升效率。

  示例:使用 Session 保持登录状态

  TypeScript取消自动换行复制

  import requests

  # 创建Session对象

  session = requests.Session()

  # 1. 第一步:登录(Session会自动保存Cookie)

  login_url = "https://api.example.com/login"

  session.post(login_url, data={"username": "test_user", "password": "123456"})

  # 2. 第二步:调用需要登录的接口(无需再次传递密码,Session自动携带Cookie)

  user_info_url = "https://api.example.com/user/info"

  response = session.get(user_info_url)

  print("用户信息:", response.json())

  # 3. 第三步:关闭Session

  session.close()

  (三)异常捕获

  HTTP 请求可能因网络错误、接口错误等抛出异常,需通过try-except捕获常见异常(如Timeout、ConnectionError、HTTPError),确保程序稳定运行。

  示例:完整的异常捕获

  TypeScript取消自动换行复制

  import requests

  from requests.exceptions import Timeout, ConnectionError, HTTPError

  try:

  response = requests.get("https://api.example.com/weather", params={"city": "北京"}, timeout=5)

  response.raise_for_status() # 若状态码非200(如404、500),抛出HTTPError异常

  print("天气数据:", response.json())

  except Timeout:

  print("请求超时")

  except ConnectionError:

  print("网络连接错误(如域名不存在、服务器不可达)")

  except HTTPError as e:

  print(f"接口返回错误,状态码:{e.response.status_code}")

  except Exception as e:

  print(f"其他未知错误:{str(e)}")

  掌握requests库的使用,能让你轻松实现 Python 与 HTTP 服务的交互,无论是对接第三方 API、开发前后端分离项目,还是实现数据爬取,都能高效完成需求,是 Python 开发的必备技能之一。

 


猜你喜欢