2017-12-06 30 views
0

파이썬의 요청 라이브러리를 사용하여 서버간에 이진 데이터와 텍스트 문자열 (또는 다른 일반 변수)을 보내려고합니다.Python 요청 이진 데이터로 텍스트를 보냅니다.

두 서버가 서로 이야기하고 있습니다. 서버 A은 파이썬 요청 라이브러리를 통해 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 오류가 발생합니다.

내가 할 수없는 일이 불가능합니까? 바이너리 데이터를 다시 보낼 수는 있지만 커스텀 헤더 만 있으면 제대로 작동 할 것이고이를 설정하는 방법에 대한 도움을 받으실 수 있습니다.

미리 감사드립니다.

답변

3

HTTP 응답은 다음과 같습니다

HTTP/1.1 200 OK 
<headers> 
<blank line> 
<response body> 

<blank line>은 일반적으로 이러한 문자 포함 - \r\n, 또한 CRLF로 알려져있다.

따라서 서버가 응답을 보내면 클라이언트 (또는 브라우저)는 <blank line>을보고 헤더 및 응답 본문과 구별 할 수 있습니다. 따라서 <blank line> 이후의 내용은 응답 본문으로 처리됩니다.

응답 본체 1 개만이 될 수 있습니다. 따라서 응답에 colorfile_data을 보내더라도 클라이언트는이를 단일 본문으로 처리합니다.


이 문제를 해결하기 위해 취할 수있는 조치는 무엇입니까?

응답에 colorfile_data을 보냅니다. 당신의 응답은 다음과 같습니다,의가 있다고 가정 해 봅시다 :

HTTP/1.1 200 OK 
<headers> 
<blank line> 
<color><file_data> 

지금, 당신은 당신을 말할 것이다 당신의 응답에 사용자 정의 헤더를 설정할 수 있습니다 color 변수의 얼마나 많은 바이트.

예를 들어, color의 길이가 6자인 경우, 이는 6 바이트를 의미합니다. 그래서, 당신은 당신에게 color의 총 길이 말할 것 사용자 정의 헤더를 설정할 수 있습니다 클라이언트 측면에서, 그리고

HTTP/1.1 200 OK 
<headers> 
X-Color-Length: 6 
<blank line> 
<color><file_data> 

을, 당신은이 작업을 수행 할 수 있습니다

response = requests.get(...) 

color_len = response.headers['X-Color-Length'] 

color = response.content[:color_len] 
file_data = response.content[color_len:] 

UPDATE를 : 이제 이것에 대해 생각해 보았습니다. 조금 더 복잡하게 만들었습니다. 색상 값을 가지고있는 바이트 수 대신 X-Color: <color>과 같은 헤더에 직접 색상 값을 보낼 수 있습니다.

+0

xyres, 신속하고 자세한 답변을 주셔서 감사합니다. 즉, "색상"의 길이는 5 문자입니다. 그렇지 않습니까? 더 중요한 것은, 우리가 알아야 할 "붉은 색"의 길이가 아닌가? 그렇다면 색상은 "파란색", 즉 4 자입니다. 클라이언트가 반환 값의 문자 수를 어떻게 알 수 있습니까? – pshep123

+0

@ pshep123 예, 길이는 제한이 없습니다. 서버의'color' 변수의 길이를 계산하여 헤더 값을 설정해야합니다. – xyres

+0

좋아, 더 큰 질문은 간단하게'return color, file_data'라는 줄을 사용하고,'HTTP/1.1 200 OK ... '비트 전체를 만드는 것이 아니라는 것입니다. 간단한 '반환'에 헤더를 포함하려면 어떻게해야합니까? – pshep123