Seite 1 von 1

Requests Post Frage

Verfasst: Freitag 27. November 2020, 21:10
von naheliegend
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.

Re: Requests Post Frage

Verfasst: Samstag 28. November 2020, 00:03
von sls
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.

Re: Requests Post Frage

Verfasst: Samstag 28. November 2020, 07:17
von naheliegend
Danke. Das ist eine Antwort die mir hilft.

Re: Requests Post Frage

Verfasst: Samstag 28. November 2020, 07:31
von naheliegend
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)

Re: Requests Post Frage

Verfasst: Samstag 28. November 2020, 09:10
von sls
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')]

Re: Requests Post Frage

Verfasst: Samstag 28. November 2020, 15:19
von noisefloor
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

Re: Requests Post Frage

Verfasst: Samstag 28. November 2020, 18:38
von naheliegend

Code: Alles auswählen

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

for i in data:
        print(i)
Out:

Code: Alles auswählen

>> Das ist
>> ein Test

Re: Requests Post Frage

Verfasst: Samstag 28. November 2020, 20:39
von sparrow
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.

Re: Requests Post Frage

Verfasst: Samstag 28. November 2020, 21:33
von naheliegend
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'}

Re: Requests Post Frage

Verfasst: Samstag 28. November 2020, 21:42
von noisefloor
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