Requests Post Frage

Django, Flask, Bottle, WSGI, CGI…
Antworten
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Hi,

ich habe dies hier auf stackoverflow gefunden:

Code: Alles auswählen

>>> import requests
>>> r = requests.post('http://httpbin.org/post', json={"key": "value"})
>>> r.status_code
200
>>> r.json()
{'args': {},
 'data': '{"key": "value"}',
 'files': {},
 'form': {},
 'headers': {'Accept': '*/*',
             'Accept-Encoding': 'gzip, deflate',
             'Connection': 'close',
             'Content-Length': '16',
             'Content-Type': 'application/json',
             'Host': 'httpbin.org',
             'User-Agent': 'python-requests/2.4.3 CPython/3.4.0',
             'X-Request-Id': 'xx-xx-xx'},
 'json': {'key': 'value'},
 'origin': 'x.x.x.x',
 'url': 'http://httpbin.org/post'}
Warum steht {"key": "value"} in 'data' und in 'json'? Welches von beiden repräsentiert den body?
Was könnte in 'args' und in 'form' stehen? Habe nämlich auch schon post requests gesehen, wo ein dict-key-value im form steht.
Ich bin verwirrt.

Danke für die Antwort.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Probier's einfach aus. Wenn du json={'hallo': 'welt'} angibst, wird das gleiche als Zeichenkette in data stehen. json ist halt tatsächliches json, kein String. Das sieht man auch ganz schön oben im Response. data und json repräsentieren den selben Inhalt, nur anders interpretiert. Wenn du json und data gleichzeitig angibst, wird json ignoriert.

args sind Query-Arguments, die werden in einer URL mit einem "?" eingeleitet (weitere Argumente dann mittels &), z.B: http://httpbin.org/post?einArgument=bla ... ument=bla2

Wenn du form-kodierte Daten, z.B. Tuple oder andere Container-Formate an data übergibst, werden diese in form automatisch aufgelistet.

Das ganze steht in der Doku von requests sauber beschrieben und mit ein bisschen herumprobieren ist das relativ gut verständlich.
When we say computer, we mean the electronic computer.
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Danke. Das ist eine Antwort die mir hilft.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Wenn ich aber ein Tuple an data übergebe erhalte ich einen Error:

Code: Alles auswählen

for k, vs in to_key_val_list(data):
ValueError: too many values to unpack (expected 2)

Code: Alles auswählen

data = ('Das ist', 'ein Test')
print(type(data))
r = requests.post('http://httpbin.org/post', data=data)
print(r.text)
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

Requests kann nicht über das Tupel iterieren. Tupel müssen in einer Liste an data übergeben werden.

data = [('Das ist', 'ein Test'), ('Das ist', 'Test 2')]
When we say computer, we mean the electronic computer.
Benutzeravatar
noisefloor
User
Beiträge: 4250
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

das hat nichts mir requests zu tun, sondern hat was mit den Daten bzw. der Datenstruktur zu tun.

@naheliegend: wenn `data=('Das ist', 'ein Test') ist und du darüber iterierst - was liefert der Iterator zurück? Dann sollte auch klar sein, warum eine Mehrfachzuweisung nicht funktionieren kann, weil da nichts ist, was "entpackt" werden kann.

Gruß, noisefloor
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Code: Alles auswählen

data = ("Das ist", "ein Test")

for i in data:
        print(i)
Out:

Code: Alles auswählen

>> Das ist
>> ein Test
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
sparrow
User
Beiträge: 4591
Registriert: Freitag 17. April 2009, 10:28

Und wie "entpackst" du 1 Zeichenkette in 2 Variablen? Stichwort "tuple unpacking".

Edit: Nur für den Fall, dass das unklar ist: Das ist er Grund warum es nicht geht - nicht wie es gehen könnte.
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Strings kann man ja splitten, aber vielen Dank für die Hilfe.

Code: Alles auswählen

data = ("Das ist", "ein Test")

for i in data:
        a, b = i.split(' ', 1)
        dict = {a: b}
        print(dict)

Code: Alles auswählen

>> {'Das': 'ist'}
>> {'ein': 'Test'}
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
noisefloor
User
Beiträge: 4250
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

natürlich kann man das - das hat aber so gar nichts mit deiner Ausgangsfrage bzw. deinem Ausgangsproblem zu tun, wo es deinerseits wohl ein Verständnisproblem beim Iterieren und unpacking gab.

Gruß, noisefloor
Antworten