POSTリクエストを送信する方法は?


260

私はこのスクリプトをオンラインで見つけました:

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
ポスト要求は、サーバー側の内容に関係なく、単なるポスト要求です。
OndraŽižka12年

7
POSTリクエストを送信します。次に、サーバーはPOSTに対して302(リダイレクト)ヘッダーで応答します。実際に何が問題なのですか?
ddinchev

1
このスクリプトはpython3.2互換ではない
jdi

この例ののpython3相当は次のようになります。pastebin.com/Rx4yfknM
JDI

1
私が提案するのは、Firefoxのlive http headerアドオンをインストールし、FirefoxでURLを開いてrequest/responselive http headerアドオンでURLのparams and headersを確認することです。コードで何をするかがわかります。
RanRag

回答:


388

本当にPythonを使用してHTTPで処理したい場合は、リクエスト:HTTP for Humansを強くお勧めします。あなたの質問に適応したPOSTクイックスタートは:

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

上記と同じ結果は得られません。ページに別の問題番号を書き込んでからスクリプトを実行しましたが、結果に問題番号が表示されませんでした。
EfeBüyük17年

2
data = {'number': '12524'、を読み取るには、data = {'number':12524を変更してください。自分で変更したのですが、編集は6文字以上にする必要があります。ありがとう
kevthanewversi 2017

2
jsonの結果を取得する方法?
Yohanes AI 2018

9
:あなたは、あなたが何をすべきJSONオブジェクトを送信する必要がある場合はjson={'number': 12524...代わりにdata=...
Seraf

3
答えが「Pythonを使用してHTTPで本当に処理したい場合」と表示されるのはなぜですか?HTTPリクエストを処理することは悪い考えですか?もしそうなら、なぜですか?誰か説明していただけますか?
Jan Pisl

147

スクリプトを移植可能にする必要があり、サードパーティの依存関係を持たない場合は、これが純粋にPython 3でPOSTリクエストを送信する方法です。

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でのみ機能します。
2017年

36

urllib(GETの場合のみ)を使用してPOSTリクエストを実行することはできません。代わりに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))

4
ありがとう。data = json.dumps(payload)は私のユースケースの鍵です
Aram

11

requestsライブラリを使用して、REST APIエンドポイントにアクセスして、GET、POST、PUT、またはDELETEを実行します。残りのAPIエンドポイントURLを渡しurl、payload(dict)を渡し、dataヘッダー/メタデータを渡します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=header)
response_json = response_decoded_json.json()

print response_json

2
このコードには、インデントとヘッダーパラメータ名に関する問題があります。
xilopaint

2
headersパラメータが間違っており、jsonもここにはありません。使用する必要がありますjson.dumps(pauload)
Arash Hatami

構文エラーについては@xilopaintとArashHatamiに感謝します。今すぐ修正。
プランツェル

3

データディクショナリにはフォーム入力フィールドの名前が含まれているため、結果を見つけるためにそれらの値を正しく保持します。 フォームビュー ヘッダーは、宣言したデータのタイプを取得するようにブラウザーを構成します。リクエストライブラリを使用すると、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)

リクエストオブジェクトの詳細:https : //requests.readthedocs.io/en/master/api/


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.