当前位置: 首页 > 面试题库 >

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

孙嘉
2023-03-14
问题内容

我一直在尝试更新一个名为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。


问题答案:

我最近写了一个小功能来发送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']


 类似资料:
  • 问题内容: 我有以下抛出的非常基本的代码; 我尝试将解码设置为Data变量,如下所示,但是会引发相同的错误; 有什么建议? 问题答案: 您只是将其以错误的顺序放置,是无辜的错误。 (深入解答)。正如wim礼貌地指出的那样,在极少数情况下,他们可以选择UTF-16或UTF-32。在这种情况下,对于开发人员而言,这种情况将不那么常见,在这种情况下,他们将有意识地决定放弃宝贵的带宽。因此,如果遇到编码问

  • 我学习Python才几个星期,这个问题难倒了我。我试图创建一个简单的塔防风格的游戏使用Pyplay。已经在谷歌上搜索和研究了4个多小时(pyplay docs网站在发布时已经关闭,依赖于缓存版本)。我相信它最终会变得非常容易修复,但我没有主意了。 我把塔类放在一个文件中,主游戏循环放在另一个文件中。图像文件存储在名为“资产”的文件夹中,该文件夹与tower类和主游戏循环位于同一目录中。当我试图创建

  • 在django.http模块中定义了HttpResponse对象的API HttpRequest对象由Django自动创建,HttpResponse对象由程序员创建 在每一个视图函数中必须返回一个HttpResponse对象,当然也可以是HttpResponse子对象 1.不用模板,直接返回数据 from django.http import HttpResponse def index(req

  • 问题内容: 我已经将脚本从Python 2.7转换为3.2,并且有一个错误。 在最后一行,我得到了这个错误: 我已经安装了Python 3.2,并且已经安装了lxml-2.3.win32-py3.2.exe。 在Python 2.7上可以使用。 问题答案: 输出文件应处于二进制模式。

  • 这是我的代码的一部分,工作不正常,我试图设置键,使桨向上和向下移动,但我无法找出我的代码有什么问题。 错误是: 参数必须是rect样式对象

  • 我有一个问题,我做了一个乒乓游戏,但我有一个问题,把分数打印到pyplay窗口。 我得到错误'TypeError:参数1必须是pygame.Surface,而不是str 我在文本中输入了blit,但出现了一个错误。我知道代码乱七八糟,我稍后会修复它