Bagaimana cara mengirim permintaan POST?

260

Saya menemukan skrip ini online:

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

Tetapi saya tidak mengerti bagaimana menggunakannya dengan PHP atau apa saja yang ada di dalam variabel params atau bagaimana menggunakannya. Bisakah saya mendapatkan sedikit bantuan dengan mencoba membuatnya berfungsi?

pengguna1113569
sumber
1
Permintaan posting hanya permintaan posting, terlepas dari apa yang ada di sisi server.
Ondra Žižka
7
Ini mengirimkan permintaan POST. Kemudian server merespons dengan 302 (redirect) header ke POST Anda. Apa yang sebenarnya salah?
ddinchev
1
Skrip ini tidak terlihat pada python3.2 compat
jdi
python3 yang setara dengan contoh ini mungkin: pastebin.com/Rx4yfknM
jdi
1
Apa yang akan saya sarankan adalah instal live http headeraddon firefox dan kemudian buka url Anda di firefox dan lihat request/responseurl dalam live http headeraddon daripada Anda akan mengerti apa yang params and headersdilakukan dalam kode Anda.
RanRag

Jawaban:

388

Jika Anda benar-benar ingin menangani dengan HTTP menggunakan Python, saya sangat merekomendasikan Permintaan: HTTP untuk Manusia . QuickTart POST yang disesuaikan dengan pertanyaan Anda adalah:

>>> 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...
>>> 
parkerfath
sumber
Saya tidak bisa mendapatkan hasil yang sama seperti yang Anda lakukan di atas. Saya menulis nomor masalah lain pada halaman dan kemudian menjalankan skrip tetapi saya tidak bisa melihat nomor Masalah pada hasilnya.
Efe Büyük
2
Silakan ubah data = {'angka': 12524, untuk membaca data = {'angka': '12524' ,. Saya akan mengubahnya sendiri tetapi suntingan harus lebih dari 6 karakter. Terima kasih
kevthanewversi
2
Bagaimana cara mendapatkan hasil json?
Yohanes AI
9
Jika Anda perlu mengirim objek JSON yang harus Anda lakukan: json={'number': 12524...alih-alihdata=...
Seraf
3
mengapa jawabannya mengatakan "Jika Anda benar-benar ingin menangani dengan HTTP menggunakan Python"? apakah itu ide buruk untuk menangani permintaan HTTP? jika demikian, mengapa? adakah yang bisa menjelaskannya?
Jan Pisl
147

Jika Anda membutuhkan skrip untuk menjadi portabel dan Anda lebih suka tidak memiliki dependensi pihak ke-3, ini adalah bagaimana Anda mengirim permintaan POST murni dalam 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)

Output sampel:

{
  "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"
}
stil
sumber
6
Kode ini hanya akan berfungsi di Python 3, seperti yang saya katakan di jawabannya.
stil
36

Anda tidak dapat mencapai permintaan POST menggunakan urllib(hanya untuk GET), daripada mencoba menggunakan requestsmodul, misalnya:

Contoh 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

Contoh 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"
  },
  ...
}

Contoh 1.3:

>>> import json

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

>>> r = requests.post(url, data=json.dumps(payload))
d1jhoni1b
sumber
4
Terima kasih. data = json.dumps (payload) adalah kunci untuk usecase saya
Aram
11

Gunakan requestspustaka untuk DAPATKAN, POST, PUT atau HAPUS dengan menekan titik akhir REST API. Lewati sisa titik url api masuk url, payload (dict) di datadan header / metadata masukheaders

import requests, json

url = "bugs.python.org"

payload = {"number": 12524, 
           "type": "issue", 
           "action": "show"}

header = {"Content-type": "application/x-www-form-urlencoded",
          "Accept": "text/plain"} 

response_decoded_json = requests.post(url, data=payload, headers=header)
response_json = response_decoded_json.json()

print response_json
Pranzell
sumber
2
Kode ini memiliki masalah dengan indentasi dan nama param header.
xilopaint
2
headersparameter salah dan juga kita belum punya json di sini. Kita harus menggunakanjson.dumps(pauload)
Arash Hatami
Terima kasih @xilopaint dan ArashHatami untuk kesalahan sintaksisnya. Diperbaiki sekarang.
Pranzell
3

Kamus data Anda berisi nama-nama bidang input formulir, Anda tetap pada nilai-nilainya untuk menemukan hasil. form view Header mengonfigurasikan browser untuk mengambil tipe data yang Anda nyatakan. Dengan perpustakaan permintaan, mudah mengirim POST:

import requests

url = "https://bugs.python.org"
data = {'@number': 12524, '@type': 'issue', '@action': 'show'}
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept":"text/plain"}
response = requests.post(url, data=data, headers=headers)

print(response.text)

Lebih lanjut tentang objek Permintaan: https://requests.readthedocs.io/en/master/api/

Anastasia Didan
sumber
1

Jika Anda tidak ingin menggunakan modul yang harus Anda instal requests, dan use case Anda sangat mendasar, maka Anda dapat menggunakannyaurllib2

urllib2.urlopen(url, body)

Lihat dokumentasi untuk di urllib2sini: https://docs.python.org/2/library/urllib2.html .

Phil
sumber