摘要:在的中會使用到,因為請求提交了很多類型的數據,所以必須使用進行間隔,也就是所謂的時的格式。詳細的的格式在的文檔中有詳細的介紹。這里貼一張截獲的包的信息,來幫助大家理解一下這段代碼的原理。通過提交一份文件和一個名為的字符串。
?這段時間本人在學習Android Service相關的內容,臨時需要一個可以提供文件上傳和下載功能的服務器,于是上網查找了一個簡單服務器的python實現代碼,本著溫顧一下HTTP協議的想法,于是深入研究了一下其中的代碼,發現大家對SimpleHTTPRequestsHandler中的self.headers.plisttext.split("=")[1]語句的含義不是很理解,于是自己查閱了一下python源碼定義和相關HTTP協議文檔,理解了這段代碼的含義。
源碼定義?我們先來看一下關于plisttext的源碼定義。
#https://svn.python.org/projects/python/branches/alpha100/Lib/mimetools.py class Message(rfc822.Message): def __init__(self, fp): .... self.typeheader = self.getheader("content-type") .... def parsetype(self): str = self.typeheader if str == None: str = "text/plain" if ";" in str: i = string.index(str, ";") self.plisttext = str[i:] str = str[:i] else: self.plisttext = "" ....
?從源碼中可以得出,plisttext與HTTP頭部content-type有關,這里我們就要回想一下content-type的有關定義了。
?在w3c的文檔給出了content-type的格式定義,我們可以發現,content-type對的值有可選的內容,使用;隔開,所以plisttext的值就是parameter的內容。
Content-Type := type "/" subtype *[";" parameter] type := "application" / "audio" / "image" / "message" / "multipart" / "text" / "video" / x-token x-token :=使用原理subtype := token parameter := attribute "=" value attribute := token value := token / quoted-string token := 1* tspecials := "(" / ")" / "<" / ">" / "@" ; Must be in / "," / ";" / ":" / "" / <"> ; quoted-string, / "/" / "[" / "]" / "?" / "." ; to use within / "=" ; parameter values
?知道了plisttext代表的含義,我們再來看一下它在文件上傳過程中的作用吧。我們先來看一下它在處理文件上傳的post請求時的作用吧。
boundary = self.headers.plisttext.split("=")[1] remainbytes = int(self.headers["content-length"]) line = self.rfile.readline() remainbytes -= len(line) if not boundary in line: return (False,"Content NOT begin with boundary") line = self.rfile.readline() remainbytes -= len(line) filename = re.findall(r"Content-Disposition.*name="file"; filename="(.*)"",line) if not fn: return (False,"Can"t find out file name")
?我們都知道當通過html的form來進行文件提交時,瀏覽器會發送POST請求,并且content-type為multipart/form-data; boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZka,所以,plisttext的值為boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZka。boundary在HTTP的body中會使用到,因為post請求提交了很多類型的數據,所以必須使用boundary進行間隔,也就是所謂的Multipart Content-Type時的body格式。詳細的body的格式在w3c的文檔中有詳細的介紹。
?這里貼一張wireShark截獲的tcp包的信息,來幫助大家理解一下這段python代碼的原理。通過form提交一份文件和一個名為other的字符串。
POST / HTTP/1.1 Host: localhost:8080 Connection: keep-alive Content-Length: 269353 Cache-Control: max-age=0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Origin: http://localhost:8080 User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/43.0.2357.81 Chrome/43.0.2357.81 Safari/537.36 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryqdHXHkzdBEGWWZka Referer: http://localhost:8080/ Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4 ------WebKitFormBoundaryqdHXHkzdBEGWWZka Content-Disposition: form-data; name="file"; filename="AndroidStudy.png" Content-Type: image/png ..... //圖片內容 ------WebKitFormBoundaryqdHXHkzdBEGWWZka Content-Disposition: form-data; name="other" ffffd ------WebKitFormBoundaryqdHXHkzdBEGWWZka--
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37988.html
摘要:京東云是將京東云所有資源的管理能力通過的方式提供出來,供京東云用戶和合作伙伴使用。是京東云控制臺的有效補充,方便用戶更靈活的控制自己的云上資源。在開始調用京東云之前,需提前在京東云用戶中心賬戶管理下的管理頁面申請和密鑰對簡稱。 京東云OpenAPI是將京東云所有資源的管理能力通過API的方式提供出來,供京東云用戶和合作伙伴使用。OpenAPI是京東云控制臺的有效補充,方便用戶更靈活的控...
摘要:勵以最少的安裝方式進行最佳實踐。上面的例子接收了一個對象并準備將其序列化。裝飾器會通過進行轉換。從對象中提取的唯一字段是。是一個特殊的字段,它接受端點名稱并為響應中的端點生成一個。可以查看項查看完整列表。 大綱 簡介 安裝 快速入門 一個最小的 api 例子 資源豐富的路由 端點 參數解析 數據格式化 完整 TODO 應用例子 簡介 Flask-RESTful是一個Flas...
摘要:淺述集群日常管理維護中的一些痛點較為龐大的集群規模及容器數量維護管理。同時為了便于分類管理,避免端口沖突和資源合理利用。測試環境維護管理問題。測試版是基于與的運維管理系統。 原文出自【聽云技術博客】:http://blog.tingyun.com/web/a...時至今日,接觸kubernetes也有一段時間了,而我們的大部分業務也已經穩定地運行在不同規模的kubernetes集群上,...
摘要:目標是讓與的交互盡可能的更友好。在版本以上已經成為了默認的版本。不同類型的鍵值對分割符號分別是。這將會協商服務端和你安裝的支持的最高協議版本。 博客原文? HTTPie 是一個命令行 HTTP 客戶端。目標是讓 CLI 與 Web services 的交互盡可能的更友好。它提供了一個簡單的 http 命令,可以讓我們用簡單自然的表述發送任意 HTTP 請求,并且可以輸出帶代碼高亮的結果...
摘要:上一篇文章網絡爬蟲實戰部署相關庫的安裝下一篇文章網絡爬蟲實戰網頁基礎在寫爬蟲之前,還是需要了解一些爬蟲的基礎知識,如原理網頁的基礎知識爬蟲的基本原理基本原理等。由萬維網協會和工作小組共同合作制定的規范,目前廣泛使用的是版本。 上一篇文章:Python3網絡爬蟲實戰---14、部署相關庫的安裝:Scrapyrt、Gerapy下一篇文章:Python3網絡爬蟲實戰---16、Web網頁基礎...
閱讀 2423·2021-11-16 11:44
閱讀 853·2021-09-10 11:16
閱讀 2228·2019-08-30 15:54
閱讀 1060·2019-08-30 15:53
閱讀 1905·2019-08-30 13:00
閱讀 622·2019-08-29 17:07
閱讀 3514·2019-08-29 16:39
閱讀 3138·2019-08-29 13:30