编程与 AI12 分钟阅读更新于 2026-07-14

Python 怎么调用 HTTP 接口:从请求参数到格式化 JSON 返回

用实际接口调试场景讲清 Python 调用 HTTP API 的基本流程,包括 GET、POST、Header、JSON 请求体、响应格式化、错误排查和站内工具辅助检查。

相关工具

先弄清楚你要调的接口是什么

很多人写 Python 调接口,一上来就复制一段 requests 代码,结果不是 401,就是 400,或者返回一大串看不懂的 JSON。其实调接口之前,先要看清接口文档里的四件事:请求方法、请求地址、请求参数、请求头。请求方法常见有 GET 和 POST;请求地址就是 URL;请求参数可能放在 query string,也可能放在 JSON body;请求头里经常有 Authorization、Content-Type、User-Agent 等。

GET 通常用于查询,比如根据关键词搜索、根据 ID 获取详情。参数一般跟在 URL 后面,例如 ?keyword=python&page=1。POST 通常用于提交数据,比如创建订单、提交表单、调用模型接口。参数通常放在请求体里,格式可能是 JSON,也可能是表单。

如果接口需要登录态或密钥,文档通常会要求带 Token、API Key 或签名。新手最容易忽略 Header,导致请求明明发出去了,但接口返回未授权。调试时不要只看代码,要把请求实际发出去的 URL、Header 和 Body 都检查一遍。

先用 GET 请求跑通最简单接口

Python 标准库也能发 HTTP 请求,但日常最常用的是 requests。它不是标准库,如果本地没有,需要安装。这里先看写法:

python代码示例
import requests

url = 'https://api.example.com/search'
params = {
    'keyword': 'python',
    'page': 1,
}
response = requests.get(url, params=params, timeout=10)
print(response.status_code)
print(response.text)

params 会自动拼到 URL 后面,并处理必要的 URL 编码。不要自己手动拼一长串参数,尤其是有中文、空格、特殊符号时,很容易出错。timeout 建议加上,否则接口卡住时程序可能一直等待。

status_code 是 HTTP 状态码。200 通常表示成功,400 表示请求参数不对,401 表示未认证,403 表示无权限,404 表示地址不存在,500 表示服务端错误。不要只看 response.text,先看状态码,能更快判断问题属于哪一类。

POST JSON 请求怎么写

如果接口文档写的是 Content-Type: application/json,通常可以用 requests.post 的 json 参数。示例:

python代码示例
import requests

url = 'https://api.example.com/users'
payload = {
    'name': '张三',
    'age': 28,
    'city': '杭州',
}
headers = {
    'Authorization': 'Bearer YOUR_TOKEN',
}
response = requests.post(url, json=payload, headers=headers, timeout=10)
print(response.status_code)
print(response.text)

这里用 json=payload,而不是 data=payload。requests 会自动把字典转成 JSON 字符串,并设置合适的 Content-Type。很多接口调不通,就是因为把 JSON 请求体当成表单提交了,服务端自然解析不到字段。

如果文档明确要求表单,就用 data;如果要求上传文件,就用 files;如果要求 JSON,就用 json。不要凭感觉写。调试复杂接口时,可以先用站内 API 调试工具或浏览器开发者工具看一次完整请求,再翻译成 Python 代码。

把返回 JSON 格式化后再看

接口返回经常是一整行 JSON,看起来很难读。Python 里可以用 response.json() 解析,再用 json.dumps 格式化:

python代码示例
import json

data = response.json()
print(json.dumps(data, ensure_ascii=False, indent=2))

response.json() 要求返回内容确实是 JSON。如果服务端返回 HTML 错误页、纯文本错误信息或空响应,这一步会报错。稳一点的写法是先看 Content-Type,再尝试解析。遇到解析失败,不要马上怀疑 Python,先打印 response.text 看看服务端到底返回了什么。

格式化后的 JSON 要重点看错误码、错误信息、data 字段和分页字段。很多接口即使 HTTP 状态码是 200,业务层也可能返回 code 不等于 0,表示业务失败。调接口时要同时看 HTTP 状态码和业务状态码。

Header、Token 和签名问题怎么排查

如果接口返回 401 或 403,优先检查 Header。Authorization 是否漏了 Bearer 前缀?Token 是否过期?API Key 是否放错字段?Content-Type 是否符合文档?有些接口还要求时间戳、随机字符串和签名,少一个字段都会失败。

签名类接口尤其要细心。常见签名流程是把参数排序,拼接字符串,用 HMAC 或 Hash 生成签名,再放进 Header 或参数里。任何一个环节不同,签名都对不上。比如参数顺序、空格、URL 编码、时间戳单位、大小写,都可能导致失败。

排查时建议把最终参与签名的字符串打印出来,再用 HMAC 工具核对。不要只看签名结果,要看签名前的原文。很多时候结果不一致,不是算法错,而是拼接的原文和服务端预期不一样。

一套更稳的接口调试流程

第一步,用文档确认方法、URL、参数、Header。第二步,先用最小参数发起请求,不要一开始塞满所有字段。第三步,打印状态码、响应头和响应体。第四步,如果返回 JSON,就格式化查看;如果不是 JSON,就先解决响应内容类型问题。第五步,再把代码封装成函数。

示例封装可以这样写:

python代码示例
def request_json(method, url, **kwargs):
    response = requests.request(method, url, timeout=10, **kwargs)
    print('status:', response.status_code)
    try:
        return response.json()
    except ValueError:
        print(response.text[:500])
        return None

如果接口偶尔成功、偶尔失败,还要把请求时间、请求参数和响应内容记录下来。很多问题不是代码写错,而是参数在某些情况下为空、Token 快过期、服务端限流、网络超时或分页游标失效。调试脚本不要只打印成功结果,失败时也要保留足够信息,方便回头定位。

工具帮的 JSON 工具、Headers 解析工具、URL 解析工具和 API 调试工具可以配合使用。Python 代码负责真实请求,在线工具负责检查参数、格式和返回结构。这样比在代码里盲改更快,也更适合新手建立调试思路。

常见问题

Python 调接口一定要用 requests 吗?

不是。标准库 urllib 也能用,但 requests 写法更清楚,日常学习和脚本处理更常见。

GET 和 POST 最大区别是什么?

GET 多用于查询,参数通常在 URL 上;POST 多用于提交,参数常放在请求体里,具体以接口文档为准。

response.json() 报错怎么办?

先打印 response.status_code、Content-Type 和 response.text,确认服务端返回的是否真的是 JSON。

Python 实用

继续阅读

返回专题