2012-07-04 26 views
134

Znalazłem ten skrypt na stronie:Jak wysłać żądanie POST?

import httplib, urllib 
params = urllib.urlencode({'number': 12524, 'type': 'issue', 'action': 'show'}) 
headers = {"Content-type": "application/x-www-form-urlencoded", 
      "Accept": "text/plain"} 
conn = httplib.HTTPConnection("bugs.python.org") 
conn.request("POST", "", params, headers) 
response = conn.getresponse() 
print response.status, response.reason 
302 Found 
data = response.read() 
data 
'Redirecting to <a href="http://bugs.python.org/issue12524">http://bugs.python.org/issue12524</a>' 
conn.close() 

Ale ja nie rozumiem, jak używać go z PHP lub wszystko, co wewnątrz zmiennej params jest i jak z niego korzystać. Czy mogę prosić o pomoc przy próbie uruchomienia tego?

+1

Żądanie dotyczące postu to tylko prośba o wpis, niezależnie od tego, co jest po stronie serwera. –

+7

Spowoduje to wysłanie żądania POST. Następnie serwer odpowiada 302 (przekierowanie) nagłówków do POST. Co właściwie jest nie tak? – ddinchev

+1

Ten skrypt nie wygląda na python3.2 compat – jdi

Odpowiedz

214

Jeśli naprawdę chcesz poradzić sobie z HTTP za pomocą Pythona, bardzo polecam Requests: HTTP for Humans. POST quickstart dostosowany do Twojego pytania brzmi:

>>> import requests 
>>> r = requests.post("http://bugs.python.org", data={'number': 12524, 'type': 'issue', 'action': 'show'}) 
>>> print(r.status_code, r.reason) 
200 OK 
>>> print(r.text[:300] + '...') 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
<title> 
Issue 12524: change httplib docs POST example - Python tracker 

</title> 
<link rel="shortcut i... 
>>> 
+0

Nie mogę uzyskać takiego samego wyniku jak powyżej. Napisałem kolejny numer wydania na stronie, a następnie uruchomiłem skrypt, ale nie mogłem zobaczyć numeru wydania na wyniku. –

+1

Proszę zmienić dane = {'numer': 12524, aby odczytać dane = {'numer': '12524' ,. Sam bym to zmienił, ale zmiany muszą mieć więcej niż 6 znaków. Dziękujemy za rejestrację: – kevthanewversi

+0

: ostatnio działający kod, dane = {'@ numer ":" 12524 "," @type ":" problem "," @ action ":" pokaż "} – marr

15

nie można osiągnąć za pomocą żądania POST urllib (tylko dla GET), zamiast próbować za pomocą modułu requests, np:

Przykład 1.0:

import requests 

base_url="www.server.com" 
final_url="/{0}/friendly/{1}/url".format(base_url,any_value_here) 

payload = {'number': 2, 'value': 1} 
response = requests.post(final_url, data=payload) 

print(response.text) #TEXT/HTML 
print(response.status_code, response.reason) #HTTP 

Przykład 1.2:

>>> import requests 

>>> payload = {'key1': 'value1', 'key2': 'value2'} 

>>> r = requests.post("http://httpbin.org/post", data=payload) 
>>> print(r.text) 
{ 
    ... 
    "form": { 
    "key2": "value2", 
    "key1": "value1" 
    }, 
    ... 
} 

Przykład 1.3:

>>> import json 

>>> url = 'https://api.github.com/some/endpoint' 
>>> payload = {'some': 'data'} 

>>> r = requests.post(url, data=json.dumps(payload)) 
81

Jeśli potrzebujesz skryptu być przenośne i raczej nie ma żadnych zależności 3rd party, to w jaki sposób wysłać żądanie POST czysto w Pythonie 3.

from urllib.parse import urlencode 
from urllib.request import Request, urlopen 

url = 'https://httpbin.org/post' # Set destination URL here 
post_fields = {'foo': 'bar'}  # Set POST fields here 

request = Request(url, urlencode(post_fields).encode()) 
json = urlopen(request).read().decode() 
print(json) 

Przykładowy wynik:

{ 
    "args": {}, 
    "data": "", 
    "files": {}, 
    "form": { 
    "foo": "bar" 
    }, 
    "headers": { 
    "Accept-Encoding": "identity", 
    "Content-Length": "7", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "Python-urllib/3.3" 
    }, 
    "json": null, 
    "origin": "127.0.0.1", 
    "url": "https://httpbin.org/post" 
} 
+6

Ten kod będzie działał tylko w Python 3, tak jak powiedziałem w odpowiedzi. – stil