0

我需要在 GET 请求中发送这个 JSON 数组

{"user": "jähn", "id": 3}

我试着用

data = '{"user": "jähn", "id": 3}'
headers = {
    'Content-type': 'application/json',
    'Accept': 'text/plain'
}
request = urllib.request.Request(self.update_url, data=data,
    headers=headers, method='GET')
response = urllib.request.urlopen(request)

但它失败了: TypeError: POST data should be bytes or an iterable of bytes。它不能是 str 类型。

我觉得很奇怪的另一件事是它告诉我有关 POST 数据的信息,尽管我将请求上的方法设置为 GET。

由于这是一个简单的脚本,我不想使用像 python-requests 这样的库

4

1 回答 1

3

您不能使用 JSON 编码的正文发出 GET 请求,因为 GET 请求只包含 URL 和标头。使用 URL 编码将参数编码到 URL 中,没有将这些参数编码为 JSON 的选项。

urllib.parse.urlencode()您使用函数创建 URL 编码参数,然后使用 附加到 URL ?

from request.parse import urlencode

data = {"user": "jähn", "id": 3}  # note, a Python dictionary, not a JSON string
parameters = urlencode(data)
response = urllib.request.urlopen('?'.join((self.update_url, parameters)))

不要使用data参数;使用该关键字参数强制请求使用 POST 方法:

data必须是一个bytes对象,指定要发送到服务器的附加数据,或者None如果不需要此类数据。目前 HTTP 请求是唯一使用数据的请求;当提供数据参数时,HTTP 请求将是 POST 而不是 GET。data应该是标准application/x-www-form-urlencoded格式的缓冲区。

于 2013-08-05T13:37:00.983 回答