一尘不染

HTTPResponse对象-JSON对象必须为str,而不是“ bytes”

json

我一直在尝试更新一个名为libpynexmo的小型Python库以与Python
3一起使用。

我一直坚持这个功能:

def send_request_json(self, request):
    url = request
    req =  urllib.request.Request(url=url)
    req.add_header('Accept', 'application/json')
    try:
        return json.load(urllib.request.urlopen(req))
    except ValueError:
        return False

遇到这个问题时,json会回应:

TypeError: the JSON object must be str, not 'bytes'

我在一些地方读到,json.load应该为您传递HTTPResponse带有.read()附件的对象(在这种情况下为对象),但是它不适用于HTTPResponse对象。

我不知道下一步该怎么做,但是由于我的整个1500行脚本是新转换为Python 3的,所以我不想回到2.7。


阅读 288

收藏
2020-07-27

共1个答案

一尘不染

我最近写了一个小功能来发送Nexmo消息。除非您需要libpynexmo代码的全部功能,否则这应该为您完成工作。而且,如果您想继续检修libpynexmo,只需复制此代码即可。关键是utf8编码。

如果您想随邮件一起发送其他任何字段,请在此处找到有关 nexmo出站邮件可以包含的内容的完整文档。

Python 3.4测试了Nexmo出站(JSON):

def nexmo_sendsms(api_key, api_secret, sender, receiver, body):
    """
    Sends a message using Nexmo.

    :param api_key: Nexmo provided api key
    :param api_secret: Nexmo provided secrety key
    :param sender: The number used to send the message
    :param receiver: The number the message is addressed to
    :param body: The message body
    :return: Returns the msgid received back from Nexmo after message has been sent.
    """


    msg = {
        'api_key': api_key,
        'api_secret': api_secret,
        'from': sender,
        'to': receiver,
        'text': body
    }
    nexmo_url = 'https://rest.nexmo.com/sms/json'
    data = urllib.parse.urlencode(msg)
    binary_data = data.encode('utf8')
    req = urllib.request.Request(nexmo_url, binary_data)
    response = urllib.request.urlopen(req)
    result = json.loads(response.readall().decode('utf-8'))
    return result['messages'][0]['message-id']
2020-07-27