如何在请求正文中使用JSON发出GET请求

时间:2013-08-05 13:26:08

标签: python rest python-3.x

我需要在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数据应该是字节或可迭代的字节。它不能是str类型。

我觉得很奇怪的另一件事是它告诉我有关POST数据的事情,尽管我在Request to GET上设置了方法。

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

1 个答案:

答案 0 :(得分:3)

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

您使用urllib.parse.urlencode() function创建网址编码参数,然后使用?附加到网址。

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 格式的缓冲区。