Python-requests senden können mehrere Kopfzeilen mit dem selben key
Ich bin versucht, senden Sie eine get-Anforderung an einen server mit zwei überschriften, die den gleichen Namen haben, aber unterschiedliche Werte:
url = 'whatever'
headers = {'X-Attribute':'A', 'X-Attribute':'B'}
requests.get(url, headers = headers)
Dies offensichtlich nicht funktioniert, da die Header-Wörterbuch nicht enthalten sind zwei Schlüssel X-Attribute
.
Gibt es irgendetwas, was ich tun kann, d.h. kann ich-pass-Header als etwas anderes als ein Wörterbuch? Die Anforderung zum senden von Anfragen in dieser Art und Weise ist ein feature des Servers, und ich kann es nicht ändern.
- Warum würden Sie wollen, dies zu tun?
- Der server, den ich bin das senden von Anfragen an erwartet. Es filtert Antworten, die basierend auf den vollständigen Satz von Parametern übergeben, die Attribute sind von der form
X-Attribute:name=value
Du musst angemeldet sein, um einen Kommentar abzugeben.
requests
speichert den request-Header in einemdict
, was bedeutet, dass jeder header nur einmal vorkommen kann. Also ohne änderungen an derrequests
Bibliothek selbst wird es nicht möglich sein, senden Sie mehrere Kopfzeilen mit dem selben Namen.Jedoch, wenn der server HTTP1.1-kompatibel, es muss in der Lage sein zu akzeptieren, das gleiche wie ein header mit eine Komma-separierte Liste der einzelnen Werte.
headers={'X-Attribute': 'name=value\r\nX-Attribute: name=value'}
. Es ist nicht eine sehr gute Lösung aber...Anforderungen ist mit urllib2.urlencode unter der Haube (oder etwas ähnliches), um die Kodierung der Header.
Dies bedeutet, dass eine Liste von Tupeln können gesendet werden als die Nutzlast argument statt eines Wörterbuchs, die Befreiung der Header-Liste von der unique key-Einschränkung, die durch das Wörterbuch. Senden einer Liste von Tupeln beschrieben wird, in der urlib2.urlencode Dokumentation. http://docs.python.org/2/library/urllib.html#urllib.urlencode
Dem folgenden code wird das problem lösen, ohne Abflachung oder dirty hacks:
Anfragen speichert nun alle Header (gesendet und empfangen) Fall vor allem in den Wörterbüchern. Darüber hinaus auch, dass, obwohl, öffnen Sie eine python-Konsole und schreiben:
Was Sie bekommen, ist Undefiniertes Verhalten. (Es mag reproduzierbar, aber es ist ganz und gar nicht definiert.) Also, was Sie wirklich senden, auf Anfragen in diesem Beispiel ist dies:
Was Sie könnten versuchen, (aber nicht) ist:
Aber zumindest wird dies vollständig definiertes Verhalten (Sie werden immer senden B). Wie @mata vorgeschlagen, wenn dein server
HTTP/1.1
konform, was Sie tun können ist dieses:Ich hoffe das ist dir hilfreich.
Weiß nicht, ob Sie noch dieses Problem 5 Jahre später, aber ich war zu kämpfen, die durch das gleiche problem. Hier ist, was gearbeitet zu mir:
Ich hatte das gleiche problem mit params:
Keiner der oben genannten für mich gearbeitet.
Was funktionierte war der Bau eine Liste von Grund auf neu