0

0

Python Requests与cURL API调用差异及常见问题解决

花韻仙語

花韻仙語

发布时间:2025-11-12 11:38:30

|

801人浏览过

|

来源于php中文网

原创

python requests与curl api调用差异及常见问题解决

本文深入探讨了在将PHP cURL实现的API调用转换为Python Requests时可能遇到的常见问题,特别是针对端口指定、POST数据格式以及SSL证书验证的差异。通过分析一个具体的404错误案例,文章详细介绍了如何正确地在Python Requests中处理这些配置,包括将端口明确写入URL、使用字典格式传递表单数据,以及优化requests.Session的使用,旨在帮助开发者高效地进行跨语言API集成。

在进行API自动化或跨语言集成时,开发者经常需要将已有的cURL请求逻辑迁移到Python的Requests库。尽管Requests库以其简洁易用著称,但在处理一些底层细节时,其行为与cURL仍存在细微差异,若不加注意,可能导致意料之外的问题,例如服务器返回404错误。本教程将通过一个具体案例,详细解析这些差异及相应的解决方案。

核心差异与问题定位

在将PHP cURL代码转换为Python Requests时,出现404错误通常源于对HTTP请求细节的误解或不完全转换。以下是两个最常见的差异点:

1. 端口指定方式

cURL允许通过CURLOPT_PORT选项单独指定连接的端口,即使URL中未明确包含端口。例如,CURLOPT_PORT => 3456会指示cURL连接到3456端口,而URL可能是https://aartre.com/user/login。

立即学习Python免费学习笔记(深入)”;

然而,Python Requests库遵循更标准的HTTP客户端行为。它不会单独提供一个参数来指定端口,而是要求将端口号直接包含在URL中。如果URL是https://aartre.com/user/login,Requests会默认连接到HTTPS的443端口。如果API服务运行在非标准端口(如3456),则必须在URL中明确指定,例如https://aartre.com:3456/user/login。

错误示例(Python):

# 错误的端口指定方式,Host头中的端口不会改变Requests实际连接的端口
headers = {
    "Host":"aartre.com:3456", # 这里的端口不会被Requests用于实际连接
    # ... 其他头部
}
url = "https://aartre.com/user/login" # Requests会连接到443端口

2. POST数据格式

当发送application/x-www-form-urlencoded类型的POST请求时,cURL通常通过CURLOPT_POSTFIELDS接收一个字符串。PHP代码中常见的是手动拼接的查询字符串,如"email=".$m."&password=".$p。

Python Requests库在处理data参数时则更加智能和灵活。如果Content-Type是application/x-www-form-urlencoded,Requests期望data参数是一个字典(dict)。它会自动将字典编码为URL表单字符串。如果data参数直接传递一个字符串,Requests会将其作为原始请求体发送,而不会进行额外的编码,这可能与服务器的预期不符。

错误示例(Python):

# 错误的POST数据格式,直接传递字符串
data = "email={email}&password={password}" # Requests会直接发送此字符串,而非将其作为表单数据编码
res = post(url, data)

3. SSL证书验证

对于自签名或无效SSL证书的API,cURL通过CURLOPT_SSL_VERIFYPEER, false来禁用证书验证。Python Requests提供了等效的verify=False参数。虽然这有助于解决连接问题,但在生产环境中应谨慎使用,并尽可能配置正确的证书验证。

正确用法(Python):

import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning

# 禁用SSL警告(仅在verify=False时有效)
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

# ...
res = s.post(url, data=data, verify=False)

Python Requests最佳实践与修正方案

结合上述分析,以下是针对原始问题代码的修正方案和一些最佳实践。

修正后的Python代码

import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning

# 禁用InsecureRequestWarning,当verify=False时出现
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

def login(email, password):
    # 1. 明确在URL中指定端口号
    url = "https://aartre.com:3456/user/login"

    # 2. POST数据使用字典格式,Requests会自动编码为application/x-www-form-urlencoded
    data = {'email': email, 'password': password}

    # 使用Session发送请求,并禁用SSL验证
    res = s.post(url, data=data, verify=False)

    # 假设服务器返回JSON,使用.json()方法直接解析
    try:
        result = res.json()
        print(result)
    except requests.exceptions.JSONDecodeError:
        print("Response is not valid JSON:")
        print(res.text)

# 使用requests.Session管理会话和公共头部
with requests.Session() as s:
    # 设置会话级别的默认头部
    # 注意:Host头部通常由Requests自动管理,如果URL中已包含端口,无需在Host中重复
    headers = {
        "Connection": "keep-alive",
        "User-Agent": "Mozilla/5.0 (Linux; Android 10; M2006C3LG Build/QP1A.190711.020; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.101 Mobile Safari/537.36",
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
        "Accept-Encoding": "gzip, deflate"
    }
    s.headers.update(headers)

    email = "test@example.com" # 替换为实际邮箱
    password = 'password'      # 替换为实际密码

    login(email, password)

代码改进说明:

  1. URL中的端口: url变量现在明确包含了端口号3456,即https://aartre.com:3456/user/login。
  2. POST数据格式: data变量被修改为一个Python字典{'email': email, 'password': password}。Requests在发送application/x-www-form-urlencoded类型的请求时,会自动将此字典编码为email=...&password=...的形式。
  3. requests.Session的优化:
    • 使用with requests.Session() as s:结构,确保会话在代码块结束时被正确关闭,释放资源。
    • 将公共的headers通过s.headers.update(headers)设置到会话对象上,这样后续通过s发送的所有请求都会自动带上这些头部,避免了在每个请求中重复指定。
    • 移除了Host头部中的端口信息,因为当URL中已包含端口时,Requests会正确地构建Host头部,避免冗余或潜在冲突。
  4. 响应处理: 建议使用res.json()来解析JSON响应,这比直接打印res.text更方便,并且如果响应不是有效的JSON,它会抛出JSONDecodeError,便于错误处理。

注意事项与总结

  • 精确匹配cURL选项: 在从cURL迁移到Requests时,务必仔细检查cURL的每一个CURLOPT_选项,并寻找Requests中对应的参数。对于没有直接对应参数的,可能需要调整URL或请求体结构。
  • 理解Requests的数据处理: requests.post()方法的data参数在处理不同Content-Type时有不同行为:
    • 字典 (dict): 默认编码为application/x-www-form-urlencoded。
    • 字符串 (str): 直接作为请求体发送,不进行额外编码。
    • JSON (json): 如果传递字典给json参数,Requests会自动设置Content-Type: application/json并进行JSON编码。
  • SSL证书验证: 禁用SSL验证(verify=False)应仅用于开发和测试环境。在生产环境中,应确保服务器配置了有效的SSL证书,并让Requests进行验证,以保障通信安全。
  • 会话管理: 对于需要发送多个请求到同一服务器,或者需要维护Cookie、默认头部等状态的场景,强烈推荐使用requests.Session对象。它能提高性能,并简化代码。

通过理解这些关键差异和遵循最佳实践,开发者可以更顺畅地将cURL逻辑迁移到Python Requests,有效避免常见的API调用问题,实现稳定可靠的自动化任务。

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

769

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

661

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

764

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

639

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1325

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

549

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

579

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

709

2023.08.11

Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

5

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 9.1万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号