我目前正在使用CURL将一个http请求发送到shell脚本中的URL,其中包含以下内容:
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:无法实例化类型的值[simple type,class com.sherwin.polling.push来自JSON String的.nouns.util.StoreForm];没有单字符串构造函数/工厂方法"
我假设这意味着服务器(我无法访问此代码)将数据作为单个字符串获取,但构造函数需要两个字符串?如果是这样,我将如何将其构造为两个字符串?如果没有,我可能做错了什么?
编辑:服务器管理员告诉我,我需要格式化我的数据 {"类型":"存储""数据":[" 9953"]} 所以我改为:data = urllib.urlencode({"type":"store","data":["9953"]})
但它也不起作用, 我在这里看到数据输出 数据:数据=%5B%279953%27%5D& type = store
编辑:我删除了编码并将其作为字符串发送:
request = urllib2.Request(url, data='{"type":"store","data":["9953"]}')
所以现在我的数据输出与它看起来的样子相匹配 数据:{"输入":"存储","数据":[" 9953"]}
但现在我得到了: org.codehaus.jackson.JsonParseException:意外的输入结束:ARRAY的预期关闭标记(来自[来源:org.jboss.resteasy.core.interception.MessageBodyReaderContextImpl$InputStreamWrapper@614ba804;第2行,第15列])
任何帮助将不胜感激。谢谢。
答案 0 :(得分: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"}))