Post Request mithilfe von requests

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
luggees
User
Beiträge: 2
Registriert: Montag 22. Januar 2018, 20:33

Hallo zusammen,

ich würde gerne ein verschachtelte Daten mithilfe von requests Post-Request zu einer Website schicken.
Ich halte mich Strikt an die Dokumentation (http://docs.python-requests.org/en/mast ... st-request)

Bei folgender Nutzung:

Code: Alles auswählen

>>> payload = (('key1', 'value1'), ('key1', 'value2'))
>>> r = requests.post('http://httpbin.org/post', data=payload)
>>> print(r.text)

Sollte dieses Ergebnis rauskommen:

Code: Alles auswählen

{
  ...
  "form": {
    "key1": [
      "value1",
      "value2"
    ]
  },
  ...
}
Wenn ich das ganze mittels

Code: Alles auswählen

echo var_dump($_POST);
php-seitig ausgebe bekomme ich folgendes Ergebnis:

Code: Alles auswählen

array(1) {
  ["key1"]=>
  string(6) "value2"
}
Das heißt der Wert "value1" ist nicht in dem Array enthalten.
Auch wenn ich das ganze in einem Dictionary verpacke, etwa so

Code: Alles auswählen

dict = {"key": ["value1", "value2"]
wird immer nur der letzte Wert "mitgegeben".
Wer kann hierbei Hilfestellung leisten? Vielen Dank im Vorraus.
Benutzeravatar
noisefloor
User
Beiträge: 3829
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

`payload = (('key1', 'value1'), ('key1', 'value2'))` kann nicht funktionieren, weil die `key1` erst `value1` zuweist und dann mit `value2` überschreibst. Was auf dem Server ankommt ist also korrekt bzw das, was du machst.

Dein Beispiel, was du gerne hättest, zieht stark nach JSON aus - dann musst du deinem Request auch JSON mitgeben und ggf. auch den Context-Type auf JSON setzen (weiß gerade nicht, ob requests das automatisch erkennt oder ob man das explizit angeben muss).

Gruß, noisefloor
luggees
User
Beiträge: 2
Registriert: Montag 22. Januar 2018, 20:33

noisefloor hat geschrieben:Hallo,

`payload = (('key1', 'value1'), ('key1', 'value2'))` kann nicht funktionieren, weil die `key1` erst `value1` zuweist und dann mit `value2` überschreibst. Was auf dem Server ankommt ist also korrekt bzw das, was du machst.

Dein Beispiel, was du gerne hättest, zieht stark nach JSON aus - dann musst du deinem Request auch JSON mitgeben und ggf. auch den Context-Type auf JSON setzen (weiß gerade nicht, ob requests das automatisch erkennt oder ob man das explizit angeben muss).

Gruß, noisefloor
Hallo noisefloor,

danke für deine Antwort. Der Hinweis das ganze als JSON zu übermitteln, hat mich dann zur Lösung gebracht:

Code: Alles auswählen

    
    payload = {"key1": [500, 1000, 1500]}
    r = requests.post(url, data=json.dumps(payload))
    print(r.text)
Wichtig auch in php folgende Zeile zu ergänzen:

Code: Alles auswählen

$_POST = json_decode(file_get_contents('php://input'), true);
    	echo var_dump($_POST);
Die Ausgabe lautet nun:

Code: Alles auswählen

array(1) {
  ["key1"]=>
  array(3) {
    [0]=>
    int(500)
    [1]=>
    int(1000)
    [2]=>
    int(1500)
  }
}
Danke nochmals!
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@noisefloor: bei HTTP kann man einen Key mehrfach versenden, und zwar genau so wie luggees es versucht hat. Wird z.B. bei HTML-Forms für Multiselect-Listboxen verwendet.

Also hier mal ein Bottle-Beispiel:

Code: Alles auswählen

from bottle import request, post, run

@post('/')
def index():
  print request.POST.allitems()

run(port=5555)
und der Requests-Aufruf:

Code: Alles auswählen

requests.post('http://localhost:5555/', data=[('a','b'), ('a','d')])
ergibt als Ausgabe das gewünschte:
[codebox=text file=Unbenannt.txt][('a', 'b'), ('a', 'd')][/code]

Was dann aber PHP an Blödsinn macht, weiß ich auch nicht, aber wer benutzt heutzutage noch PHP.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Disclaimer: das letzte mal mit PHP vor 15 Jahren gearbeitet.

Mir ist so, als ob man da den Variablennamen mit [] beenden muss. Dann ist es ein Array. So blöd ist das nicht, weil es dann immer ein Array ist. Man spart sich also eine Verzweigung.
__deets__
User
Beiträge: 14480
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nachtrag: kann auch sein, das ich das mit Ruby verwechsel. Alles lange her.
Antworten