web-dev-qa-db-fra.com

Comment envoyer POST demande?

J'ai trouvé ce script en ligne:

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

Mais je ne comprends pas comment l’utiliser avec PHP, ce que tout est dans la variable params ou comment l’utiliser. Puis-je avoir un peu d'aide pour essayer de faire fonctionner cela?

204
user1113569

Si vous voulez vraiment gérer HTTP avec Python, je vous recommande vivement Requests: HTTP for Humans . Le quickstart POST adapté à votre question est le suivant:

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

Si vous avez besoin que votre script soit portable et que vous préfériez ne pas avoir de dépendances tierces, vous envoyez la demande POST uniquement en 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)

Exemple de sortie:

{
  "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"
}
115
stil

Vous ne pouvez pas réaliser de demandes POST à l'aide de urllib (uniquement pour GET); essayez plutôt d'utiliser requests module, par exemple:

Exemple 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

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

Exemple 1.3:

>>> import json

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

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

Utilisez la bibliothèque requests pour GET, POST, PUT ou DELETE en cliquant sur un noeud final d'API REST. Transmettez l'URL du noeud final de l'API restante dans url, la charge utile (dict) dans data et l'en-tête/les métadonnées dans headers

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=head)
 response_json = response_decoded_json.json()

 print response_json
0
Pranzell

Si vous ne voulez pas utiliser un module, vous devez l'installer comme requests et que votre cas d'utilisation est très basique, vous pouvez alors utiliser urllib2

urllib2.urlopen(url, body)

Voir la documentation de urllib2 ici: https://docs.python.org/2/library/urllib2.html .

0
Phil