POST isteği nasıl gönderilir?


260

Bu betiği çevrimiçi buldum:

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

Ancak PHP ile nasıl kullanılacağını veya params değişkeninin içindeki her şeyin ne olduğunu veya nasıl kullanılacağını anlamıyorum. Bunun işe yaramasını sağlamak için lütfen biraz yardım alabilir miyim?


1
Gönderme isteği, sunucu tarafında ne olursa olsun, yalnızca gönderim isteğidir.
Ondra Žižka

7
Bu bir POST isteği gönderir. Ardından sunucu POST'nize 302 (yönlendirme) üstbilgileriyle yanıt verir. Aslında yanlış olan ne?
ddinchev

1
Bu script python3.2 uyumlu görünmüyor
jdi

Bu örneğin python3 eşdeğeri şunlar olabilir: pastebin.com/Rx4yfknM
jdi

1
Ne önermek firefox live http headereklentisini yüklemek ve daha sonra urfox'unuzu firefox'ta açmak ve kodunuzda ne yapacağınızı anlayacağınızdan eklenti request/responseiçinde url'yi görmek . live http headerparams and headers
RanRag

Yanıtlar:


388

Python kullanarak HTTP ile gerçekten başa çıkmak istiyorsanız, İstekler: İnsanlar için HTTP'yi şiddetle tavsiye ederim . Sorunuza uyarlanmış POST hızlı başlangıç:

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

Yukarıda yaptığınızla aynı sonucu alamıyorum. Sayfaya başka bir sayı yazdım ve komut dosyasını çalıştırdım, ancak sonuçta Sayı numarasını göremedim.
Efe Büyük

2
Verileri okumak için lütfen verileri {{number ': 12524, değiştirin = {' number ':' 12524 ',. Bunu kendim değiştirirdim ama düzenlemelerin 6 karakterden fazla olması gerekiyor. Teşekkürler
kevthanewversi

2
Json sonucu nasıl alınır?
Yohanes AI

9
Bir JSON nesnesi göndermeniz gerekiyorsa şunları yapmalısınız: json={'number': 12524...Bunun yerinedata=...
Seraf

3
neden "Python kullanarak HTTP ile gerçekten ilgilenmek istiyorsanız" yazıyor? HTTP isteklerini işlemek kötü bir fikir mi? Öyleyse neden? kimse açıklayabilir mi lütfen?
Jan Pisl

147

Betiğinizin taşınabilir olması gerekiyorsa ve herhangi bir 3. taraf bağımlılığı istemiyorsanız, POST isteğini yalnızca Python 3'te bu şekilde gönderirsiniz.

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)

Örnek çıktı:

{
  "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
Bu kod cevapta söylediğim gibi sadece Python 3'te çalışacaktır.
stil

36

POST isteklerini urllib(yalnızca GET için) kullanarak gerçekleştiremezsiniz, bunun yerine requestsmodülü kullanmayı deneyin , örn:

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

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

Örnek 1.3:

>>> import json

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

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

4
Teşekkürler. data = json.dumps (yük) benim kullanımımın anahtarı
Aram

11

requestsBir REST API uç noktasına basarak GET, POST, PUT veya DELETE için kitaplığı kullanın . Kalan api bitiş noktası URL'sini url, yük (dict) değerini datave üstbilgiyi / meta verileriheaders

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

2
Bu kod, girinti ve başlık parametresi adı ile ilgili sorunlara sahip.
19'da xilopaint

2
headersparametresi yanlış ve burada herhangi bir jsonumuz yok. Biz kullanmalıdırjson.dumps(pauload)
Arash Hatami

Sözdizimi hatası için @xilopaint ve ArashHatami'ye teşekkürler. Şimdi düzeltildi.
Pranzell

3

Veri sözlüğünüz form giriş alanlarının adlarını içerir, sonuçları bulmak için değerlerini sağda tutmanız yeterlidir. form görünümü Üstbilgi, tarayıcıyı bildirdiğiniz veri türünü alacak şekilde yapılandırır. İstek kütüphanesi ile POST göndermek kolaydır:

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)

İstek nesnesi hakkında daha fazla bilgi: https://requests.readthedocs.io/en/master/api/


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.