2013-06-21 7 views
2

Python으로 편안한 웹 서비스에 클라이언트 인터페이스를 프로그래밍하고 있지만 불행히도 웹 서비스에서는 요청에 사용자 정의 헤더가 있어야합니다. 나는 이것에 대한 요청을 사용했지만 웹 서비스는 헤더가 요청의 특정 순서로 있어야한다. Requests가 어떻게 헤더를 주문하는지 그리고이 주문을 제어 할 수있는 방법이 있는지 알아낼 수 없었습니다.HTTP 헤더의 순서가 제어 된 Python HTTP 요청

추천이있는 경우 내 신청서에 요청 이외의 다른 모듈을 사용할 수도 있습니다.

+2

만약 내가 당신이라면 API 유지 보수 담당자에게 버그 신고서를 제출할 것입니다. 이는 HTTP 사양을 분명히 위반하고 있기 때문입니다. [RFC 2616 섹션 4.2] (http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2)는 '서로 다른 필드 이름을 가진 헤더 필드를받는 순서는 중요하지 않습니다. '헤더에 특정 순서를 요구하는 것은 불편하지 않을뿐만 아니라 올바르지 않습니다. – rdlowrey

+0

완전히 동의하지만 불행히도 시간이 걸릴 것이며이 프로젝트를 완료해야한다는 압력을 받고 있습니다. 감사. – user2509689

답변

1
대신 요청의 기본 하나, 헤더를 저장하기 위해 OrderedDict 클래스를 사용하려고 할 수

:

>>> from collections import OrderedDict 
>>> from requests import Session 
>>> s = Session() 
>>> s.headers 
CaseInsensitiveDict({'Accept-Encoding': ... 'User-Agent': ... 'Accept': '*/*'}) 
>>> s.headers = OrderedDict([('User-Agent', 'foo-bar'), ('Accept', 'nothing')]) 
>>> s.headers 
OrderedDict([('User-Agent', 'foo-bar'), ('Accept', 'nothing')]) 
+0

불행히도 r = s.get (url) 요청을 보낸 다음 r.request.headers를 사용하여 헤더를 확인하면 s.headers와 동일한 순서가 아니므로 s.headers에서 올바른 것이지만. 기묘한. – user2509689

+0

요청이 dict 하위 클래스 인 자체 CaseInsensitiveDict를 사용하기 때문에 이는 작동하지 않습니다. 헤더를 전달하면 제공 한 것과 함께 자신의 dict을 초기화합니다. – num1

+0

@ num1 : [docs] (http://docs.python-requests.org/en/master/user/advanced/#header-ordering)는 세션 헤더를 재정의하기에 충분해야한다고 주장합니다 ('OrderedDict'로). [테스트 (2 년)] (https://github.com/requests/requests/blob/0eb9a4c1617909bbbb465a9987c7cba0f515eaa6/tests/test_requests.py#L434-L452)는 제대로 작동해야한다고 제안합니다. – jfs

3

업데이트 대답

2.9.2 아래의 우려 버전 아래의 대답. 버전 2.9.2 이후 (2016 년 4 월경) OrderedDictworks again을 사용합니다.

올드 대답

그것은 그냥 내장 기능 (issue 179)를 사용하여 몇 시간 전에 가능했던 것 같습니다. 나는 그것이 더 이상 (issue 2057)이 아닌 이유 중 하나가 num1에 의해 다른 의견에 언급되어 있다고 생각합니다. 나는 다음 해결책/해결 방법을 사용했다.

import requests 
import collections 

class SortedHTTPAdapter(requests.adapters.HTTPAdapter): 
    def add_headers(self, request, **kwargs): 
     request.headers = collections.OrderedDict(
      ((key, value) for key, value in sorted(request.headers.items())) 
     ) 

session = requests.Session() 
session.mount("http://", SortedHTTPAdapter()) 

예에서 머리글은 정렬 만되어 있지만 어떤 방식 으로든 정렬 할 수 있습니다. requests 코드를 읽고 메소드의 docstring을 읽은 다음 해당 방법을 선택했습니다.

연결에 필요한 헤더를 추가합니다. v2.0에서 이것은 기본적으로 을 수행하지 않지만, HTTPAdapter <requests.adapters.HTTPAdapter> 클래스를 서브 클래스 화하는 사용자에 의해 무시되도록 남아 있습니다.

절대 제어의 경우 send 메서드를 무시할 수 있습니다.

+0

[OrderedDict' 사용]으로 충분해야합니다. (https://stackoverflow.com/questions/17239952/python-http-request-with-controlled-ordering-of-http-headers#comment79715787_17240379) – jfs

+0

답변했습니다. 원래 @ michaelmeyer의 대답에 대한 논평에서. – wodny