【发布时间】:2017-07-14 13:37:43
【问题描述】:
我目前正在使用 CURL 向 shell 脚本中的 URL 发送 http 请求:
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"]})
但它也不起作用, 我在这里看到的数据输出为 数据:data=%5B%279953%27%5D&type=store
编辑:我去掉了编码并将其作为字符串发送:
request = urllib2.Request(url, data='{"type":"store","data":["9953"]}')
所以现在我的数据输出与它应该的样子相匹配 数据:{"type":"store","data":["9953"]}
但现在我得到: org.codehaus.jackson.JsonParseException:意外的输入结束:ARRAY 的预期关闭标记(来自 [来源:org.jboss.resteasy.core.interception.MessageBodyReaderContextImpl$InputStreamWrapper@614ba804;行:2,列:15])
任何帮助将不胜感激。谢谢。
【问题讨论】: