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.