[英]Python requests send text with binary data
我正在嘗試使用python的請求庫在服務器之間發送二進制數據和文本字符串(或任何其他常規變量)。
我有兩台服務器互相通信。 服務器A通過python的請求庫發送GET請求。 看起來像這樣:
color, file_data = requests.get('https://www.serverb.com/testing', params = {...})
服務器B然后執行以下操作:
var1 = request.args.get('var1')
var2 = request.args.get('var2')
# This function creates a binary file, saves it to disk, and returns the file name.
res = some_function(var1, var2)
file_data = codecs.open(res, 'rb').read()
return 'Success!', file_data
但是,當我嘗試這樣做時,服務器B拋出500錯誤。
我試圖做的事是不可能的嗎? 如果我只能使用自定義標頭發送回二進制數據,那也可以,並且對如何設置這些標定會有所幫助。
提前致謝。
HTTP響應如下所示:
HTTP/1.1 200 OK
<headers>
<blank line>
<response body>
<blank line>
通常包含以下字符- \\r\\n
,也稱為CRLF
。
因此,當服務器發送響應時,客戶端(或瀏覽器)可以通過查看<blank line>
與報頭和響應正文區分開。 因此, <blank line>
之后的任何內容都將被視為響應主體。
這意味着,最多只能有1個響應主體 。 因此,即使您認為要像發送操作一樣分別發送color
和file_data
,它們仍會在一個響應中進行,客戶端會將它們視為一個整體。
您可以做什么來解決這個問題?
您需要一種方法來知道響應主體的哪一部分是color
,哪一部分是file_data
。 您可以通過發送自定義標頭以及響應來實現。
假設您的回復如下所示:
HTTP/1.1 200 OK
<headers>
<blank line>
<color><file_data>
現在,您可以在響應中設置自定義標頭,該標頭將告訴您color
變量有多少字節。
例如,如果color
值為yellow
並且是6個字符,則表示它具有6個字節。 因此,您可以設置一個自定義標題,該標題將告訴您color
的總長度:
HTTP/1.1 200 OK
<headers>
X-Color-Length: 6
<blank line>
<color><file_data>
然后,在客戶端,您可以從X-Color-Length
標頭中獲取總字節,並從正文中讀取該字節數以獲取color
的值。 例:
response = requests.get(...)
color_len = response.headers['X-Color-Length']
color = response.content[:color_len]
file_data = response.content[color_len:]
更新:現在我考慮了一下,我已經使它比應該的要復雜一些。 您可以直接在X-Color: <color>
類的標頭中直接發送顏色的值,而不是發送它具有的字節數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.