Einfache URL GET / POST-Funktion in Python


80

Ich kann es nicht googeln, aber ich möchte eine Funktion, die dies tut:

Akzeptiere 3 Argumente (oder mehr, was auch immer):

  • URL
  • ein Wörterbuch der Parameter
  • POST oder GET

Geben Sie mir die Ergebnisse und den Antwortcode zurück.

Gibt es einen Ausschnitt, der dies tut?


Die Frage ist nicht klar - dies ist für eine lokale URL, dh. Sie schreiben einen Server oder eine Remote-URL, dh. Sie schreiben einen Kunden?
Charles Duffy

Bitte verwenden Sie in Zukunft mehr problembeschreibende Titel.
Kissaki

Antworten:


111

Anfragen

https://github.com/kennethreitz/requests/

Hier sind einige gebräuchliche Verwendungsmöglichkeiten:

import requests
url = 'https://...'
payload = {'key1': 'value1', 'key2': 'value2'}

# GET
r = requests.get(url)

# GET with params in URL
r = requests.get(url, params=payload)

# POST with form-encoded data
r = requests.post(url, data=payload)

# POST with JSON 
import json
r = requests.post(url, data=json.dumps(payload))

# Response, status etc
r.text
r.status_code

httplib2

https://github.com/jcgregorio/httplib2

>>> from httplib2 import Http
>>> from urllib import urlencode
>>> h = Http()
>>> data = dict(name="Joe", comment="A test comment")
>>> resp, content = h.request("http://bitworking.org/news/223/Meet-Ares", "POST", urlencode(data))
>>> resp
{'status': '200', 'transfer-encoding': 'chunked', 'vary': 'Accept-Encoding,User-Agent',
 'server': 'Apache', 'connection': 'close', 'date': 'Tue, 31 Jul 2007 15:29:52 GMT', 
 'content-type': 'text/html'}

Sie könnten auchfrom httplib2 import Http as h
3k-

3
@ 3k Nein, er instanziiert die HttpKlasse, ohne sie zu aliasen : h = Http(), nicht h = Http.
Ecstaticpeon

@ecstaticpeon du hast sehr recht, ich muss sehr müde gewesen sein. danke für die Korrektur!
3k

Es wäre schön, wenn Sie dies auf native Weise ohne Bibliotheken von Drittanbietern tun würden.
Benutzer

Warum ist das die Antwort? das ist KEINE Funktion !!!
Uberrebu

52

Noch einfacher: über das Anforderungsmodul .

import requests
get_response = requests.get(url='http://google.com')
post_data = {'username':'joeb', 'password':'foobar'}
# POST some form-encoded data:
post_response = requests.post(url='http://httpbin.org/post', data=post_data)

Um Daten zu senden, die nicht formularcodiert sind, senden Sie sie serialisiert als Zeichenfolge (Beispiel aus der Dokumentation ):

import json
post_response = requests.post(url='http://httpbin.org/post', data=json.dumps(post_data))
# If using requests v2.4.2 or later, pass the dict via the json parameter and it will be encoded directly:
post_response = requests.post(url='http://httpbin.org/post', json=post_data)

3
Ich musste die post_data in json.dumps () verpacken, bevor es für mich funktionierte:data=json.dumps(post_data)
Matt

1
@Matt, ich denke, dass dies davon abhängt, ob Sie formularcodierte Daten (nur ein Diktat übergeben) oder nicht formularcodierte Daten (Übergabe einer Zeichenfolge von JSON-Daten) senden möchten. Ich beziehe mich hier auf die Dokumente: docs.python-requests.org/en/latest/user/quickstart/…
ropable

Gibt es eine Version dieses Moduls für Windows?
TheGoodUser

@TheGoodUser Diese Bibliothek (und viele mehr) sind für Windows kompiliert und hier verfügbar: lfd.uci.edu/~gohlke/pythonlibs/#requests
ropable

33

Sie könnten dies verwenden, um urllib2 zu verpacken:

def URLRequest(url, params, method="GET"):
    if method == "POST":
        return urllib2.Request(url, data=urllib.urlencode(params))
    else:
        return urllib2.Request(url + "?" + urllib.urlencode(params))

Dadurch wird ein Anforderungsobjekt zurückgegeben , das Ergebnisdaten und Antwortcodes enthält.


11
Ich bevorzuge diese, um mich an die Standardbibliothek zu halten.
Charles Duffy

sollte es url + "sein?" anstelle von url + '&'?
Paulo Scardine

1
Das ist schön, aber um genau zu sein, das RequestObjekt selbst hat keine Ergebnisdaten oder Antwortcodes - es muss über eine Methode wie "angefordert" werden urlopen.
Bach

@Bach Haben Sie hier ein Beispiel für den Code, der das "angeforderte" Teil wie urlopen mit der URLRequest-Methode erfüllt? Ich kann nirgendwo einen finden.
TheJerm

@theJerm, ich habe darauf verwiesen. Versuchen Sie r = urllib2.urlopen(url)und dann r.readlines()und / oder r.getcode(). Möglicherweise möchten Sie stattdessen auch Anfragen verwenden.
Bach

10
import urllib

def fetch_thing(url, params, method):
    params = urllib.urlencode(params)
    if method=='POST':
        f = urllib.urlopen(url, params)
    else:
        f = urllib.urlopen(url+'?'+params)
    return (f.read(), f.code)


content, response_code = fetch_thing(
                              'http://google.com/', 
                              {'spam': 1, 'eggs': 2, 'bacon': 0}, 
                              'GET'
                         )

[Aktualisieren]

Einige dieser Antworten sind alt. Heute würde ich das requestsModul wie die Antwort von Robaple verwenden.


9

Ich weiß, dass Sie nach GET und POST gefragt haben, aber ich werde CRUD bereitstellen, da andere dies möglicherweise nur für den Fall benötigen: (Dies wurde in Python 3.7 getestet. )

#!/usr/bin/env python3
import http.client
import json

print("\n GET example")
conn = http.client.HTTPSConnection("httpbin.org")
conn.request("GET", "/get")
response = conn.getresponse()
data = response.read().decode('utf-8')
print(response.status, response.reason)
print(data)


print("\n POST example")
conn = http.client.HTTPSConnection('httpbin.org')
headers = {'Content-type': 'application/json'}
post_body = {'text': 'testing post'}
json_data = json.dumps(post_body)
conn.request('POST', '/post', json_data, headers)
response = conn.getresponse()
print(response.read().decode())
print(response.status, response.reason)


print("\n PUT example ")
conn = http.client.HTTPSConnection('httpbin.org')
headers = {'Content-type': 'application/json'}
post_body ={'text': 'testing put'}
json_data = json.dumps(post_body)
conn.request('PUT', '/put', json_data, headers)
response = conn.getresponse()
print(response.read().decode(), response.reason)
print(response.status, response.reason)


print("\n delete example")
conn = http.client.HTTPSConnection('httpbin.org')
headers = {'Content-type': 'application/json'}
post_body ={'text': 'testing delete'}
json_data = json.dumps(post_body)
conn.request('DELETE', '/delete', json_data, headers)
response = conn.getresponse()
print(response.read().decode(), response.reason)
print(response.status, response.reason)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.