web-dev-qa-db-ja.com

urllib2およびjson

jSON形式のデータでurllib2を使用してPOSTリクエストを行う方法を教えてくれるチュートリアルを教えてもらえますか?

69
pup

Messaの答えは、サーバーがcontent-typeヘッダーを確認することに煩わされていない場合にのみ機能します。本当に機能させるには、content-typeヘッダーを指定する必要があります。コンテンツタイプヘッダーを含めるように修正されたMessaの回答を次に示します。

import json
import urllib2
data = json.dumps([1, 2, 3])
req = urllib2.Request(url, data, {'Content-Type': 'application/json'})
f = urllib2.urlopen(req)
response = f.read()
f.close()
135
Bob Van Zant

UrllibがContent-Lengthを把握するために使用しているものはすべて、jsonによって混乱しているように見えるため、それを自分で計算する必要があります。

import json
import urllib2
data = json.dumps([1, 2, 3])
clen = len(data)
req = urllib2.Request(url, data, {'Content-Type': 'application/json', 'Content-Length': clen})
f = urllib2.urlopen(req)
response = f.read()
f.close()

これを理解するために永遠に私を連れて行ったので、私はそれが他の誰かを助けることを願っています。

36
CloudMarc

例-JSONとしてエンコードされたデータをPOST data:

import json
import urllib2
data = json.dumps([1, 2, 3])
f = urllib2.urlopen(url, data)
response = f.read()
f.close()
17
Messa

JSON応答を読み取るには、json.loads()を使用します。これがサンプルです。

import json
import urllib
import urllib2

post_params = {
    'foo' : bar
}

params = urllib.urlencode(post_params)
response = urllib2.urlopen(url, params)
json_response = json.loads(response.read())
5
eseceve

あなたは確かに適切なAjaxリクエストを得るためにヘッダーをハックしたい:

_headers = {'X_REQUESTED_WITH' :'XMLHttpRequest',
           'ACCEPT': 'application/json, text/javascript, */*; q=0.01',}
request = urllib2.Request(path, data, headers)
response = urllib2.urlopen(request).read()
_

そしてjson.loadsにPOST=サーバー側で。

編集:ところで、送信する前に urllib.urlencode(mydata_dict) する必要があります。そうしないと、POSTはサーバーが期待するものになりません

3
Stan

これは私のために働いたものです:

import json
import requests
url = 'http://xxx.com'
payload = {'param': '1', 'data': '2', 'field': '4'}
headers = {'content-type': 'application/json'}
r = requests.post(url, data = json.dumps(payload), headers = headers)
2
arcana