06 Python HTTP 请求入门

发布时间:2026/7/30 17:32:40
06 Python HTTP 请求入门 Python HTTP 请求入门一、程序怎么和外界通信你的 Python 脚本 ──HTTP 请求──▶ 远程服务器API ◀──HTTP 响应── 返回 JSON / 文本二、requests 入门安装 requestsrequests 是 Python 最常用的 HTTP 库语法简单项目根目录下先激活虚拟环境再安装cd D:\test\python_study python -m venv .venv .venv\Scripts\activate pip install requests验证python-cimport requests; print(requests.__version__)第 1 行python -m venv .venv作用创建虚拟环境部分含义python调用系统里的 Python-m venv以模块方式运行 venvPython 自带的虚拟环境工具.venv在当前目录下创建名为 .venv 的文件夹执行后会在项目根目录生成 .venv/里面有独立的 Python 和 pip依赖只装在这个项目里不影响系统全局 Python。类比前端 类似在项目里初始化一个独立的依赖空间类似有独立 node_modules 的项目环境而不是用全局安装的包。第 2 行.venv\Scripts\activate作用激活虚拟环境执行后当前终端会「切换」到 .venv 里的 Python 和 pip。成功后提示符前会出现 (.venv)例如(.venv) PS D:\test\python_study第 3 行pip install requests作用在当前环境里安装 requests 这个第三方包部分含义pipPython 的包管理器类似前端的 npm / pnpminstall安装依赖类似 npm installrequests要安装的包名用来发 HTTP 请求前提是你已经激活了虚拟环境提示符里有 (.venv)这样包装进项目的 .venv不会污染全局 Python。GET 请求的两种传参类型写法例子路径参数写在 URL 路径里/posts/1、/api/voi/123查询参数写在?后面Query String/posts?userId1前端路由里的params如/api/voi/:id指的是路径参数Pythonrequests里的params指的是查询参数不要混用。路径参数直接拼进 URLpost_id1responserequests.get(fhttps://jsonplaceholder.typicode.com/posts/{post_id})dataresponse.json()# 返回 dictid1 的那篇文章查询参数URL 后面加?keyvaluehttps://jsonplaceholder.typicode.com/posts?userId1用params传查询参数更清晰responserequests.get(https://jsonplaceholder.typicode.com/posts,params{userId:1},)print(response.url)# 看最终拼好的 URLdataresponse.json()# 返回 list该用户的所有帖子推荐的公开测试 API本课用 JSONPlaceholder — 免费、稳定、无需 API Key端点说明GET /posts/1获取 id1 的文章返回 dictGET /posts?userId1获取 userId1 的所有文章返回 listGET /users/1获取 id1 的用户信息常见错误错误原因ModuleNotFoundError: No module named ‘requests’没安装或虚拟环境没激活ConnectionError网络不通或 URL 写错KeyErrorJSON 字段名写错先用 print(data) 看结构不检查 status_code 直接用 .json()404/500 时可能解析失败三、POST 请求发 POST 的几种方式# 方式 1发 JSON推荐API 最常用# json 会自动做两件事把 dict 转成 JSON 字符串并设置 Content-Type: application/json。requests.post(url,json{key:value})# 方式 2手动发 JSON 字符串需自己设 Content-Type# 用 data 传字符串时requests 默认是 application/x-www-form-urlencoded表单编码需手动设为 JSON。requests.post(url,data{key: value},headers{Content-Type:application/json})# 方式 3纯文本requests.post(url,datahello world,headers{Content-Type:text/plain})# 方式 4表单字段data 传 dict 时常见requests.post(url,data{key:value})# 默认 application/x-www-form-urlencodedHeader请求头 / 响应头Header 是请求的「元信息」键值对形式。常见请求头Header作用例子Content-TypeBody 是什么格式application/jsonAuthorization身份认证Bearer sk-xxxxLLM API 常用User-Agent客户端是谁MyApp/1.0在 requests 里设置 Headerheaders{User-Agent:PythonStudy/1.0}responserequests.get(url,headersheaders)看响应头print(response.headers)# 全部响应头print(response.headers.get(Content-Type))# 常见application/json; charsetutf-8HTTP 状态码状态码含义你该怎么想200OK成功正常处理 response.json()201Created创建成功POST 创建资源时常见400Bad Request请求有误检查 Body、参数格式401Unauthorized未授权缺 API Key 或 Key 无效404Not Found找不到URL 或 id 写错你测过 99990500Internal Server Error服务器内部错误通过response.status_code读取。读响应体response.text# 字符串原始文本response.json()# 解析成 dict/list前提是 JSONresponse.content# 二进制 bytes图片等对象属性 和 字典键 的区别response ← httpx.Response 对象 ├── status_code ← 对象的属性int ├── headers ← 对象的属性Headers 映射 │ └── Content-Type ← headers 里的一个键字符串 └── ...四、httpx — API支持 async/await安装 httpx环境同上pip install httpx保存二进制文件文本用 write_text()图片用 write_bytes()frompathlibimportPath pathPath(downloads/cat.jpg)path.parent.mkdir(parentsTrue,exist_okTrue)# 确保目录存在path.write_bytes(response.content)# 写入二进制parentsTrue自动创建路径上所有缺失的上级目录。比如会依次创建a → a/b → a/b/c。如果 parentsFalse默认中间缺一层就会报错。exist_okTrue目录已经存在时不报错。exist_okFalse默认目录已存在 → 抛 FileExistsErrorexist_okTrue目录已存在 → 静默跳过常见组合就是「缺啥建啥有了也不报错」。httpx 异步下载一张图importhttpxasyncdefdownload_image(url:str,save_path:Path)-bool:asyncwithhttpx.AsyncClient(timeout30.0)asclient:responseawaitclient.get(url)ifresponse.status_code200:save_path.write_bytes(response.content)returnTruereturnFalseresponse.content 是 bytes 类型正好对应图片二进制数据。

相关新闻

最新新闻

日新闻

周新闻

月新闻