目錄一, urllib介紹二, 功能開發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, 調用鑒權接口獲取token2, 調用語音合成接口轉換文本為語音代碼目錄: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.zipc) 讀取頭信息Content-Type,解析文件格式,比如:audio/wavd) 將文件數據保存三, 單元測試test_http_util.py調用http_util封裝的功能函數,測試如下:1. test_http_str()請求http://www.baidu.com,得到字符串信息:2. Test_http_json()調用百度鑒權接口庫,返回JSON格式數據,解析得到access_token3. 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/wav2,調用請求傳遞參數時出錯: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#學浪計劃#