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

python如何发送http请求 python发送http请求方法

  在 Python 开发中,发送 HTTP 请求是高频需求,无论是调用第三方 API、爬取网页数据,还是与后端服务交互,都需通过 HTTP 请求实现数据传输。Python 提供了多个库支持 HTTP 请求,其中urllib(标准库)和requests(第三方库)最为常用。小编将详解这两个库的使用方法,覆盖 GET/POST 核心请求、参数配置及异常处理,助你高效完成 HTTP 交互需求。

  一、核心库选择:urllib vs requests

  Python 发送 HTTP 请求的库主要分为两类,选择需结合场景需求:

  urllib:Python 标准库(无需额外安装),包含urllib.request(请求发送)、urllib.parse(参数解析)等模块,兼容性强但语法较繁琐,适合无第三方库依赖的场景;

  requests:第三方库(需pip install requests安装),API 设计简洁直观,支持会话保持、文件上传等高级功能,开发效率更高,是日常开发的首选。

360截图20250426224640574.jpg

  二、基础 HTTP 请求实现:GET 与 POST

  HTTP 请求中,GET 用于获取数据,POST 用于提交数据(如表单、JSON),以下分别用两个库实现核心场景。

  (一)使用 requests 库:简洁高效

  requests库通过requests.get()、requests.post()等方法直接发送请求,返回的Response对象包含响应数据、状态码等信息。

  1. GET 请求:获取数据(如查询接口)

  GET 请求的参数通常拼接在 URL 后,用params参数传入字典即可自动编码,无需手动处理 URL 拼接。

  TypeScript取消自动换行复制

  import requests

  # 目标接口:查询天气(示例接口,需替换为有效API)

  url = "https://api.example.com/weather"

  # GET参数:城市、日期

  params = {"city": "Beijing", "date": "20250901"}

  # 发送GET请求,设置超时时间(避免无限等待)

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

  # 处理响应

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

  print("响应文本:", response.text) # 字符串形式响应内容

  print("JSON响应:", response.json()) # 若响应为JSON,直接解析为字典

  2. POST 请求:提交数据(如表单 / JSON)

  POST 请求数据需放在请求体中,根据接口要求选择 “表单格式” 或 “JSON 格式”:

  表单格式:用data参数传入字典,请求头Content-Type自动设为application/x-www-form-urlencoded;

  JSON 格式:用json参数传入字典,请求头自动设为application/json(推荐接口交互使用)。

  TypeScript取消自动换行复制

  # 1. 提交表单数据

  form_data = {"username": "test", "password": "123456"}

  response_form = requests.post(

  "https://api.example.com/login",

  data=form_data,

  timeout=5

  )

  # 2. 提交JSON数据(更常用)

  json_data = {"user_id": 1001, "action": "get_info"}

  response_json = requests.post(

  "https://api.example.com/user",

  json=json_data,

  timeout=5

  )

  print("JSON响应结果:", response_json.json())

  (二)使用 urllib 库:标准库实现

  urllib需手动处理参数编码、请求对象构建,步骤较繁琐,但无需依赖第三方库。

  1. GET 请求:手动编码参数

  TypeScript取消自动换行复制

  from urllib import request, parse

  url = "https://api.example.com/weather"

  params = {"city": "Shanghai", "date": "20250901"}

  # 1. 编码参数(转换为URL字符串格式)

  encoded_params = parse.urlencode(params)

  # 2. 拼接URL

  full_url = f"{url}?{encoded_params}"

  # 3. 发送请求

  with request.urlopen(full_url, timeout=5) as response:

  # 读取响应(字节流需解码为字符串)

  response_text = response.read().decode("utf-8")

  print("响应文本:", response_text)

  2. POST 请求:构建请求对象

  TypeScript取消自动换行复制

  import json

  url = "https://api.example.com/user"

  json_data = {"user_id": 1002, "action": "get_info"}

  # 1. 转换JSON数据为字节流

  data_bytes = json.dumps(json_data).encode("utf-8")

  # 2. 构建请求对象,设置请求头

  req = request.Request(

  url=url,

  data=data_bytes,

  headers={"Content-Type": "application/json"} # 手动设置JSON头

  )

  # 3. 发送请求

  with request.urlopen(req, timeout=5) as response:

  response_json = json.loads(response.read().decode("utf-8"))

  print("JSON响应:", response_json)

  三、进阶操作:headers、Cookie 与会话保持

  实际开发中,需配置请求头(如 User-Agent)、携带 Cookie 或保持会话,确保请求符合接口要求。

  (一)设置请求头:模拟浏览器 / 合法身份

  部分接口会验证User-Agent(判断是否为浏览器请求)或Authorization(身份令牌),需在请求中添加 headers:

  TypeScript取消自动换行复制

  headers = {

  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0",

  "Authorization": "Bearer your_token_here" # 接口认证令牌

  }

  response = requests.get(

  "https://api.example.com/protected",

  headers=headers,

  timeout=5

  )

  (二)携带 Cookie:维持登录状态

  若接口需登录后访问,可通过cookies参数携带 Cookie(字典格式):

  TypeScript取消自动换行复制

  cookies = {"session_id": "abc123xyz789", "user_name": "test"}

  response = requests.get(

  "https://api.example.com/user/info",

  cookies=cookies,

  timeout=5

  )

  (三)会话保持:复用连接与 Cookie

  使用requests.Session()创建会话对象,可自动保存 Cookie、复用 TCP 连接,适合多请求交互(如登录后多次访问接口):

  TypeScript取消自动换行复制

  # 创建会话

  session = requests.Session()

  # 1. 登录(会话自动保存Cookie)

  login_data = {"username": "test", "password": "123456"}

  session.post("https://api.example.com/login", json=login_data, timeout=5)

  # 2. 后续请求(自动携带登录Cookie)

  response = session.get("https://api.example.com/user/orders", timeout=5)

  print("用户订单:", response.json())

  # 关闭会话

  session.close()

  四、异常处理:确保请求稳定性

  网络波动、接口错误可能导致请求失败,需捕获requests.exceptions或urllib.error中的异常,避免程序崩溃:

  TypeScript取消自动换行复制

  import requests

  from requests.exceptions import Timeout, ConnectionError, HTTPError

  try:

  response = requests.get("https://api.example.com/weather", timeout=5)

  response.raise_for_status() # 若状态码≥400(如404、500),抛出HTTPError

  print("请求成功:", response.json())

  except Timeout:

  print("请求超时:请检查网络或增加超时时间")

  except ConnectionError:

  print("连接失败:请检查URL或服务器状态")

  except HTTPError as e:

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

  except Exception as e:

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

  Python 发送 HTTP 请求的核心库中,requests以简洁的 API、丰富的功能成为首选,适合绝大多数开发场景;urllib作为标准库,适合无第三方依赖的环境。实际开发中,需根据请求类型(GET/POST)选择对应方法,配置 headers、Cookie 或会话保持以适配接口要求,同时通过异常处理确保请求稳定性。

 


猜你喜欢