簡體   English   中英

Python請求發送帶有二進制數據的文本

[英]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個響應主體 因此,即使您認為要像發送操作一樣分別發送colorfile_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM