2013-08-05 11 views
0

Мне нужно отправить этот JSON массив в запросе GETКак сделать запрос 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, хотя я установил метод в запросе GET.

Поскольку это простой сценарий, я предпочел бы не использовать библиотеку как питон-запросы

+0

Запрос GET никогда не будет запросом JSON; это будет запрошенный URL-запрос. –

+5

Другими словами, при запросе GET есть ** ** запрос тела запроса. Существует только URL-адрес и заголовки. –

ответ

3

Вы не можете сделать запрос GET с JSON-закодирован телом, так как запрос GET только когда-либо состоит из URL и заголовки. Параметры кодируются в URL с использованием кодировки URL вместо этого, нет возможности кодировать такие параметры для JSON.

Вы создаете URL-кодированные параметры с помощью urllib.parse.urlencode() function, а затем добавили к 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 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.

+0

Мне пришлось изменить '?'. Join (self.update_url, parameters) в url = '% s?% S'% (self.update_url, data), но теперь это работает спасибо! – user1703761

+0

Извините, забыли пару парнеров. Рад помочь! –

Смежные вопросы