2016-08-11 19 views
1

urllib & urllib2を使って投稿リクエストを投稿して2日間から苦労しています。私はカールやリクエストライブラリの使用に制限があります。私のコードを展開する必要があるマシンは、これらのいずれもサポートしていないからです。400のリクエストがありませんPOSTのためのurllib2を使って

ポストコールには、ヘッダーとjsonボディが付随します。私はコールを得ることができますが、データ&でPOSTは400の悪い要求をスローします。 Google/stackoverflowで利用可能なすべてのオプションを試してみましたが、何も解決しませんでした!

以下

サンプルコードです: - 以下、

import urllib 
import urllib2 

url = 'https://1.2.3.4/rest/v1/path' 
headers = {'X-Auth-Token': '123456789sksksksk111', 
      'Content-Type': 'application/json'} 
body = {'Action': 'myaction', 
     'PressType': 'Format1', 'Target': '/abc/def'} 
data = urllib.urlencode(body) 
request = urllib2.Request(url, data, headers) 
response = urllib2.urlopen(request, data) 

とデバッグハンドラの設定にトレースすることができ、要求の形式である: -

send: 'POST /rest/v1/path HTTP/1.1\r\nAccept-Encoding: identity\r\nContent-Length: 52\r\nHost: 1.2.3.4\r\nUser-Agent: Python-urllib/2.7\r\nConnection: close\r\nX-Auth-Token: 123456789sksksksk111\r\nContent-Type: application/json\r\n\r\nAction=myaction&PressType=Format1&Target=%2Fabc%2Fdef' 

reply: 'HTTP/1.1 400 Bad Request\r\n' 

注意してください、同じPOSTリクエストは、RESTクライアントとRequestsライブラリで完璧に機能します。デバッグハンドラの出力では、json構造がContent-Type:application/json\r\n\r\nAction=myaction&PressType=Format1&Target=%2Fabc%2Fdefであることがわかります。

+0

特にurllibを使用したいのですが、私もリクエストモジュールを使用する必要がありますか? –

+0

@akashkarothiya: - 質問からの引用: - "カールまたはリクエストライブラリの使用に制限があります": – Deca

答えて

1

jsonをエンコードする代わりにダンプできます。私は同じものに直面していて、それで解決されました!

data = urllib.urlencode(body)を削除し、解決しなければならないurllib2.urlopen(req, json.dumps(data))

を使用しています。

+0

ありがとうございました。少なくとも400の悪い要求の問題を解決しました。 :) – Deca

関連する問題