POSTリクエストをJSONとして送信するにはどうすればよいですか?


105
data = {
        'ids': [12, 3, 4, 5, 6 , ...]
    }
    urllib2.urlopen("http://abc.com/api/posts/create",urllib.urlencode(data))

POSTリクエストを送信したいのですが、フィールドの1つは数値のリストでなければなりません。どうやってやるの ?(JSON?)


1
しかし、それはすでに数のリストではありませんか?
Waynn Lue

これは、APIが予期する入力の種類を知らなければ答えられません。
Niklas B.

1
@WaynnLue APIサーバーは、リストではなく文字列としてそれを取得しています。
TIMEX 2012年

1
ヘッダーを「application / json」などに設定する必要がありますか?
TIMEX 2012年

回答:


154

サーバーがPOSTリクエストがjsonであることを期待している場合は、ヘッダーを追加し、リクエストのデータをシリアル化する必要があります...

Python 2.x

import json
import urllib2

data = {
        'ids': [12, 3, 4, 5, 6]
}

req = urllib2.Request('http://example.com/api/posts/create')
req.add_header('Content-Type', 'application/json')

response = urllib2.urlopen(req, json.dumps(data))

Python 3.x

https://stackoverflow.com/a/26876308/496445


ヘッダーを指定しない場合は、デフォルトのapplication/x-www-form-urlencodedタイプになります。


質問があります。ヘッダーに複数の項目を追加することは可能ですか...コンテンツタイプやクライアントIDなど... @jdi
Omar

@OmarJandali、add_header()追加するヘッダーごとに、もう一度呼び出します。
jdi 2017

次のコードを記述しましたが、何も印刷されません。URLとヘッダーを印刷するはずでしたが、何も印刷されませんでした... req = urllib.Request('http://uat-api.synapsefi.com') req.add_header('X-SP-GATEWAY', 'client_id_asdfeavea561va9685e1gre5ara|client_secret_4651av5sa1edgvawegv1a6we1v5a6s51gv') req.add_header('X-SP-USER-IP', '127.0.0.1') req.add_header('X-SP-USER', '| ge85a41v8e16v1a618gea164g65') req.add_header('Content-Type', 'application/json') print(req)...
Omar Jandali 2017

urllib2が認識されなかったので、urllibを使用しました。リクエストでエラーも発生しています。The view tab.views.profileSetup didn't return an HttpResponse object. It returned None instead. @jdi
Omar

@OmarJandali、この回答はもともと2012年にpython 2.xで提供されたことに注意してください。Python3を使用しているため、インポートは異なります。それは今だろうimport urllib.requesturllib.request.Request()。さらに、reqオブジェクトを出力しても、何もおもしろくない。印刷によってヘッダーが追加されたことがはっきりとわかりますreq.headers。それを超えて、なぜそれがあなたのアプリケーションで機能しないのか私は不思議ではありません。
JDI

113

信じられないほどのrequestsモジュールを使用することをお勧めします。

http://docs.python-requests.org/en/v0.10.7/user/quickstart/#custom-headers

url = 'https://api.github.com/some/endpoint'
payload = {'some': 'data'}
headers = {'content-type': 'application/json'}

response = requests.post(url, data=json.dumps(payload), headers=headers)

これは私に与えるTypeError: post() takes from 1 to 2 positional arguments but 3 were given
ザクダンス2013

66

python 3.4.2の場合、次のように動作することがわかりました。

import urllib.request
import json      

body = {'ids': [12, 14, 50]}  

myurl = "http://www.testmycode.com"
req = urllib.request.Request(myurl)
req.add_header('Content-Type', 'application/json; charset=utf-8')
jsondata = json.dumps(body)
jsondataasbytes = jsondata.encode('utf-8')   # needs to be bytes
req.add_header('Content-Length', len(jsondataasbytes))
print (jsondataasbytes)
response = urllib.request.urlopen(req, jsondataasbytes)

1
Python3.6.2はこれでうまくいきました。req.add_header(...)でヘッダーを追加するだけでうまくいきました。
Shalin LK 2017

18

これは Python 3.5。URLにクエリ文字列/パラメータ値が含まれている場合、

リクエストURL = https://bah2.com/ws/rest/v1/concept/
パラメータ値= 21f6bb43-98a1-419d-8f0c-8133669e40ca

import requests

url = 'https://bahbah2.com/ws/rest/v1/concept/21f6bb43-98a1-419d-8f0c-8133669e40ca'
data = {"name": "Value"}
r = requests.post(url, auth=('username', 'password'), verify=False, json=data)
print(r.status_code)

7
コードスニッパーでは、ヘッダー変数は未使用のままです
2017年

4

ヘッダーを追加しないと、http 400エラーが発生します。コードはpython2.6、centos5.4でうまく機能します

コード:

    import urllib2,json

    url = 'http://www.google.com/someservice'
    postdata = {'key':'value'}

    req = urllib2.Request(url)
    req.add_header('Content-Type','application/json')
    data = json.dumps(postdata)

    response = urllib2.urlopen(req,data)

2

Python標準ライブラリのurllib.requestオブジェクトの使用例を以下に示します。

import urllib.request
import json
from pprint import pprint

url = "https://app.close.com/hackwithus/3d63efa04a08a9e0/"

values = {
    "first_name": "Vlad",
    "last_name": "Bezden",
    "urls": [
        "https://twitter.com/VladBezden",
        "https://github.com/vlad-bezden",
    ],
}


headers = {
    "Content-Type": "application/json",
    "Accept": "application/json",
}

data = json.dumps(values).encode("utf-8")
pprint(data)

try:
    req = urllib.request.Request(url, data, headers)
    with urllib.request.urlopen(req) as f:
        res = f.read()
    pprint(res.decode())
except Exception as e:
    pprint(e)

1

最新のリクエストパッケージではjsonrequests.post()メソッドのパラメーターを使用してjson辞書を送信でき、Content-Typeinヘッダーはに設定されapplication/jsonます。ヘッダーを明示的に指定する必要はありません。

import requests

payload = {'key': 'value'}

requests.post(url, json=payload)

これにより、POSTされたjsonが一重引用符で囲まれることに注意してください。これは技術的に無効です。
Jethro

@Jethro単一引用符を使用するときにエラーが発生しましたか?Pythonで単一引用符を使用することは有効です。個人的には、これに関して問題はありません。
jdhao

Aah謝罪しました。サーバーが一重引用符で囲まれたJSONを受け取っていると思いましたが、それは別の問題であり、いくつかの誤解を招くデバッグであることがわかりました。乾杯、これはヘッダーを手動で指定する必要があるよりもずっと簡単です!
Jethro

0

これは私にとってAPIでうまくいきます

import requests

data={'Id':id ,'name': name}
r = requests.post( url = 'https://apiurllink', data = data)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.