PHP Curl转Python Requests调用API遇404问题求助
解决Python Requests调用API返回404的问题
看起来你遇到了一个典型的请求细节不匹配问题——PHP脚本能正常调用/api/current-event-id接口,但用Python Requests实现时却返回404,不过登录和登出都正常,这说明session会话是有效的,问题肯定出在两个请求的格式差异上。我们来一步步排查:
核心差异点分析
对比你的PHP和Python代码,有两个关键差异可能导致404:
GET请求的Content-Type头
- 你的PHP代码在发送GET请求时,没有手动设置Content-Type,Curl会自动根据请求类型适配;但Python代码里给
/api/current-event-id的GET请求加了content-type: application/json头。 - 绝大多数情况下,GET请求不需要设置Content-Type,而且这个额外的头可能和API服务器预期的请求格式不匹配,导致路由匹配失败,返回404。
- 你的PHP代码在发送GET请求时,没有手动设置Content-Type,Curl会自动根据请求类型适配;但Python代码里给
URL拼接的斜杠重复问题
- PHP里
BASE_URL是https://website.api.com/,拼接/api/current-event-id后会变成https://website.api.com//api/current-event-id(两个斜杠),虽然很多服务器会自动处理,但部分严格的路由规则会把这个当成无效路径。你的Python代码也存在同样的问题。
- PHP里
修复方案
方案1:移除GET请求的多余头(最可能解决问题)
直接去掉获取事件ID请求中的headers参数,因为GET请求不需要这个Content-Type:
修改后的代码片段:
# 获取当前事件ID,移除不必要的headers resp = session.get(BASE_URL + '/api/current-event-id') print(resp.status_code) print(resp.text)
方案2:修正URL拼接格式
把BASE_URL末尾的斜杠去掉,避免拼接时出现重复斜杠:
BASE_URL = 'https://website.api.com' # 去掉末尾的/ # 之后拼接接口路径时直接加/api/xxx resp = session.get(BASE_URL + '/api/current-event-id')
方案3:模拟PHP的GET请求细节(可选)
如果上面两个方案都不行,可以尝试完全模拟PHP Curl的GET请求行为——PHP的CurlGet函数设置了空的POSTFIELDS,虽然这不符合HTTP规范,但有些API可能依赖这个奇怪的行为:
# 模拟PHP带空POST体的GET请求 resp = session.get(BASE_URL + '/api/current-event-id', data='')
完整修复后的Python代码
import requests BASE_URL = 'https://website.api.com' # 移除末尾斜杠,避免路径重复 API_USER = "username" API_PASS = "password" session = requests.Session() # 登录:使用data参数默认就是application/x-www-form-urlencoded,和PHP一致 resp = session.post(BASE_URL + '/api/login', data={'username': API_USER, 'password': API_PASS}) if resp.status_code != 200: print("*** ERROR ***: Login failed.") else: print("API login successful.") # 获取当前事件ID:移除多余headers,保证路径正确 resp = session.get(BASE_URL + '/api/current-event-id') print(resp.status_code) print(resp.text) # 登出 resp = session.get(BASE_URL + '/api/logout') if resp.status_code != 200: print("*** ERROR ***: Logout failed.") else: print("API logout successful.")
为什么这能解决问题?
- 你之前给GET请求加的
application/json头是画蛇添足,API服务器可能因为这个不匹配的头,无法识别请求对应的路由,直接返回404; - 修正URL的斜杠问题,确保请求路径和PHP版本完全一致,避免路由匹配失败。
内容的提问来源于stack exchange,提问作者Andrew Young
相关产品推荐
相关产品推荐

