简体   繁体   中英

How do I make a GET request with JSON in the request body

I need to send this JSON array in a GET request

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

I tried to use

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)

But its failing with: TypeError: POST data should be bytes or an iterable of bytes. It cannot be of type str.

Another thing that I find quite weird is that it tells me about POST data although I set the method on the Request to GET.

Since this is a simple script I'd prefer not to use a library like python-requests

You cannot make a GET request with a JSON-encoded body, as a GET request only ever consists of the URL and the headers. Parameters are encoded into the URL using URL encoding instead, there is no option to encode such parameters to JSON instead.

You create URL-encoded parameters with the urllib.parse.urlencode() function , then appended to the URL with ? .

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)))

Do not use the data parameter; using that keyword argument forces a request to use the POST method:

data must be a bytes object specifying additional data to send to the server, or None if no such data is needed. Currently HTTP requests are the only ones that use data; the HTTP request will be a POST instead of a GET when the data parameter is provided. data should be a buffer in the standard application/x-www-form-urlencoded format.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM