2017-07-14 16 views
0

私は現在、以下でシェルスクリプト内のURLにHTTPリクエストを置くためにCURLを使用しています:ノーシングルのStringコンストラクタ/ファクトリメソッド

RES=`curl $USER -X PUT -H "Accept: application/json" -H "Content-Type: application/json" -s -o /dev/null -w "%{http_code}" -d "{\"type\":\"$TYPE\",\"data\":[${STORES}]}" ${STR}` 

これはうまく動作します。しかし、私はこれをPythonで書き直そうとしていますが、動作させるのには苦労しています。 HTTPステータス400 - org.codehaus.jackson.map.JsonMappingException:

url = 'https://url.com/polling/v1/5cb401c5-bded-40f8-84bb-6566cdeb3dbb/stores' 
data = urllib.urlencode({"type":"store","data":"9953"}) 
request = urllib2.Request(url) 
request.add_header("Authorization", "Basic %s" % creds) 
request.add_header("Content-type", "application/json") 
request.add_header("Accept", "application/json") 
print "Data: %s" % request.get_data() 
print "Accept: %s" % request.get_header("Accept") 
print "Content-Type: %s" % request.get_header("Content-type") 
print "Authorization: %s" % request.get_header("Authorization") 
try: 
    result = urllib2.urlopen(request, data) 
except urllib2.HTTPError as e: 
    print e.read() 
    exit() 
data = json.loads(result.read()) 
print data 

私は取得しています例外はJBWEB000065」であるタイプ[単純型、クラスcom.sherwin.polling.pushの値をインスタンス化することはできません。 nouns.util.StoreForm] from JSON String;単一文字列コンストラクタ/ファクトリメソッドはありません "

これは、サーバー(私はこのコードにアクセスできない)がデータを単一の文字列ですが、コンストラクタは2つの文字列を期待していますか?もしそうなら、私はこれをどのように2つの文字列に構成しますか?そうでない場合は、どうしたらいいですか?

EDIT:

data = urllib.urlencode({"type":"store","data":["9953"]}) 
:だから私はに変更 サーバ管理者は、私が {[ "9953"]: "店"、 "データ" "タイプ"}のように私のデータをフォーマットする必要が私に言いました

しかし、それはどちらか動作しません、 は私が データとして、ここでデータ出力を見ている:データ=%5B%279953% 27%5D &タイプ=店舗

編集:私は、エンコーディングを取り除かと送りますそれは文字列として:

request = urllib2.Request(url, data='{"type":"store","data":["9953"]}') 

だから今、私のデータ出力がそのが データのように見えることになったものと一致:{「タイプ」:「店舗」、「データ」:[「9953」]}

しかし、今、私は取得しています: をorg.codehaus.jackson.JsonParseException:予期しない入力の終わり:ARRAYの予想されるクローズマーカー([Source:org.jboss.resteasy.co[email protected]614ba804; 2行:15])

助けていただければ幸いです。ありがとうございました。

答えて

0

次の例のように、あなたのコードを簡素化するためにrequestsのlibを使用しようとすることができます:

import requests 

requests.put('url.com', data={"type":"store","data":"9953"}).json() 

それとも、json.dumps()関数を使用しようとurllib2.urlopen使用することができます。

request.get_method = lambda: 'PUT' 
urllib2.urlopen(request, json.dumps({"type":"store","data":"9953"})) 
関連する問題