2017-07-14 48 views
0

我目前使用curl把HTTP請求的URL中的shell腳本如下:無單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重寫這個,但我努力讓它工作。

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:HTTP狀態400 - org.codehaus.jackson.map.JsonMappingException:無法實例類型[簡單類型,類com.sherwin.polling.push的價值。 nouns.util.StoreForm]從JSON字符串;沒有單字符串構造函數/工廠方法「

我假設這意味着服務器(我沒有訪問此代碼)獲取數據作爲單個字符串,但構造函數需要兩個字符串?如果是這樣,我將如何構造這是兩個字符串?如果不是,我可能會做錯什麼?

編輯:服務器管理員告訴我,我需要格式化我的數據,如 {「類型」:「存儲」,「數據」:「9953」]} 所以我改成:

data = urllib.urlencode({"type":"store","data":["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"})) 
相關問題