web-dev-qa-db-ja.com

Curl POST pycurlコードへのリクエスト

次のcurlリクエストをpycurlに変換しようとしています。

curl -v
-H Accept:application/json \
-H Content-Type:application/json \
-d "{
    name: 'abc',
    path: 'def',
    target: [ 'ghi' ]
}" \
-X POST http://some-url

私は次のpythonコード:

import pycurl, json

c = pycurl.Curl()
c.setopt(pycurl.URL, 'http://some-url')
c.setopt(pycurl.HTTPHEADER, ['Accept: application/json'])
data = json.dumps({"name": "abc", "path": "def", "target": "ghi"})
c.setopt(pycurl.POST, 1)
c.setopt(pycurl.POSTFIELDS, data)
c.setopt(pycurl.VERBOSE, 1)
c.perform()
print curl_agent.getinfo(pycurl.RESPONSE_CODE)
c.close()

これを実行すると、エラー415:Unsupported media typeが発生したため、変更しました:

c.setopt(pycurl.HTTPHEADER, ['Accept: application/json'])

に:

c.setopt(pycurl.HTTPHEADER, [ 'Content-Type: application/json' , 'Accept: application/json'])

今回は400:Bad requestです。ただし、curlを使用したbashコードは機能します。 pythonコードで何を修正すればよいかご存知ですか?

10
Konrad

Bashの例では、プロパティtargetは配列です。Pythonの例では、文字列です。

これを試して:

data = json.dumps({"name": "abc", "path": "def", "target": ["ghi"]})

また、はるかに優れたAPIを備えた requests ライブラリをチェックアウトすることを強くお勧めします。

import requests
data = {"name": "abc", "path": "def", "target": ["ghi"]}
response = requests.post('http://some-url', json=data)
print response.status_code
5
Daniel Hepper

これはもう1年以上前ですが、ヘッダー値の空白を削除してみてください。

c.setopt(pycurl.HTTPHEADER, ['Accept:application/json'])

API /メソッドはクリーンで使いやすいので、requestsモジュールも使用することを好みます。

3
Brian

同様の問題があり、コード例を使用しましたが、httpheaderセクションを次のように更新しました。

c.setopt(pycurl.HTTPHEADER, ['Content-Type:application/json'])
1
Ashwin Venkat