【问题标题】:no single-String constructor/factory method没有单字符串构造函数/工厂方法
【发布时间】: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])

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: python json jackson


    【解决方案1】:

    您可以尝试使用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"}))
    

    【讨论】:

      猜你喜欢
      • 2018-02-12
      • 2012-09-29
      • 2023-03-16
      • 2014-07-20
      • 2019-01-21
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 2018-09-09
      相关资源
      最近更新 更多