2012-07-04 7 views
134

Я нашел этот сценарий онлайн:Как отправить запрос 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() 

Но я не понимаю, как использовать его с PHP или то, что все в переменной Params является или, как его использовать. Могу ли я, пожалуйста, немного помочь с попыткой заставить это работать?

+1

Почтовый запрос - это только почтовый запрос, независимо от того, что на стороне сервера. –

+7

Отправляет запрос POST. Затем сервер отвечает на 302 (перенаправление) заголовков на ваш POST. Что на самом деле не так? – ddinchev

+1

Этот скрипт не выглядит python3.2 compat – jdi

ответ

214

Если вы действительно хотите обрабатывать HTTP с помощью Python, я настоятельно рекомендую Requests: HTTP for Humans. POST quickstart адаптированный к вашему вопросу:

>>> 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

Я не могу получить тот же результат, что и вы выше. Я написал другой номер проблемы на странице, а затем запустил сценарий, но я не смог увидеть номер проблемы в результатах. –

+1

Пожалуйста, измените данные = {'number': 12524, чтобы прочитать данные = {'number': '12524' ,. Я бы сам изменил его, но редактирование должно быть более 6 символов. Спасибо – kevthanewversi

+0

для записи: рабочий код недавно для меня, data = {'@ number': '12524', '@type': 'issue', '@action': 'show'} – marr

15

Вы не можете достичь запросов POST с помощью urllib (только для GET), вместо того, чтобы попытаться использовать requests модуль, например:

Пример 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 

Пример 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" 
    }, 
    ... 
} 

Пример 1,3:

>>> import json 

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

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

Если вам нужен сценарий, чтобы быть портативными, и вы предпочли бы не иметь никаких зависимостей 3rd Party, это то, как вы отправите запрос POST чисто в Python 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) 

Образец выходного сигнала:

{ 
    "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

Этот код будет работать только в Python 3, как я сказал в ответ. – stil