专业编程基础技术教程

网站首页 > 基础教程 正文

Python自带urllib标准库,HTTP开发进阶,四步完成不要太简单

ccvgpt 2024-07-23 01:33:53 基础教程 8 ℃

目录

一, urllib介绍

Python自带urllib标准库,HTTP开发进阶,四步完成不要太简单

二, 功能开发http_util.py

三, 单元测试test_http_util.py

四, 常见问题和解决方法


一, urllib介绍

Python在AI领域是主流开发语言,更多的软件应用开发也开始使用Python,有非常多且好用的标准库和第三方组件,urllib是Python自带的标准库,不需要安装,用于HTTP开发,主要模块和功能:

1. urllib.request: 发送HTTP请求,接收处理HTTP响应

2. urllib.error: 处理错误和异常,包含urllib.request抛出的异常

3. urllib.parse: 解析URL和编码数据

4. urllib.robotparser: 解析robots.txt

本文介绍urllib库中的request, error, parse三个模块在HTTP开发时的代码应用,并封装成http_util,单元测试函数实际调用百度AI语音合成接口,和项目开发一致:

1, 调用鉴权接口获取token

2, 调用语音合成接口转换文本为语音

代码目录:hello_http

├── util

│ └── http_util.py

│ └── file_util.py

│ └── code_util.py

├── tests

│ └── test_http_util.py


如何获取源码:先转发后关注,私信"HelloPython"获取下载地址。

二, 功能开发



1. urllib.request.urlopen()可以直接调用url地址,得到响应,读取数据,简单HTTP请求使用起来非常方便:


2. urllib.request.urlopen()支持Request类型参数,构造Request时配置更多的参数如header, data:


3. 封装http_data()函数,发起http请求和处理响应,注意encode()函数是对parse.urlencode()的调用封装,将data转换为byte数据:


4. 封装http_str(),将HTTP响应数据解析为字符串:


5. 封装http_json(),在响应数据为JSON内容时,解析为dict:


6. 封装http_file(),下载文件时,返回数据为二进制文件内容,存储到服务器或客户端,代码详见http_util.http_file()函数,执行流程:

a) 拼装请求参数,得到响应,调用resp.read()读取二进制数据文件内容

b) 读取头信息Content-Disposition,是否返回了文件名称?比如:attachment;fileName=zip.zip

c) 读取头信息Content-Type,解析文件格式,比如:audio/wav

d) 将文件数据保存

三, 单元测试test_http_util.py

调用http_util封装的功能函数,测试如下:

1. test_http_str()请求http://www.baidu.com,得到字符串信息:


2. Test_http_json()调用百度鉴权接口库,返回JSON格式数据,解析得到access_token


3. call_http_file()调用百度AI语音合成接口,得到文本转换成的语音数据,保存为文件:


4. 运行python manage.py test,得到语音文件<项目路径>/tmp/http_download/xxx.mp3:



四, 常见问题和解决方法

1,下载文件时,如何获取文件名称和类型?

解决:HTTP响应返回的头信息中含有文件名称和类型,但是注意这些信息可能没有返回,代码中要判断信息不存在的情况:

- 头信息Content-Disposition,包含文件名称,比如:attachment;fileName=zip.zip

- 头信息Content-Type,包含文件格式,比如:audio/wav



2,调用请求传递参数时出错:

POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.

另一个同类错误:

can't concat str to bytes


解决:调用urllib.parse.urlencode()将数据编码,或者调用封装的http_util.encode()

原因:urllib.request.Request()的data参数类型要求byte


#学浪计划#

Tags:

猜你喜欢

最近发表
标签列表