С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/35: Рейтинг темы: голосов - 35, средняя оценка - 4.97
 Аватар для mr sinister
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 49

Кодировка в JSON, полученном POST запросом

14.10.2015, 17:09. Показов 6865. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу wsgi скрипт для mod_wsgi, прикрученного к Апачу. Скрипт должен принять POSTнутый JSON, отправить его некому API, получить ответ API и отправить его обратно, в исходную точку. Вот код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import requests
import urllib.parse
 
def application(environ, start_response):
    url = "http://texchange.nowtaxi.ru/api/secret_api_key/"
    query = environ['QUERY_STRING']
 
    if query == "get":
        url += "tariff/list"
        r = requests.get(url)
        response_headers = [('Content-type', 'application/json')]
    else:
        url += "order/put"
        input_len = int(environ.get('CONTENT_LENGTH', '0'))
        data = environ['wsgi.input'].read(input_len)
        decoded = data.decode('utf-8')
        unquoted = urllib.parse.unquote(decoded)
        print(decoded)  # 'from%5Baddress%5D=%D0%'
        print(unquoted) # 'from[address]=\xd0\xa0'
        r = requests.post(url,data)
        output_len = sum(len(line) for line in r.text)
        response_headers = [('Content-type', 'application/json'),
                            ('Content-Length', str(output_len))]
 
    status = "200 OK"
 
    start_response(status, response_headers)
 
    return [r.text.encode('utf-8')]
JSON, который отправляет этому скрипту jQuery, начинается
JSON
1
{"from":{"address":"Россия
Скажите пожалуйста, получаемая строка неисправимо повреждена и надо что-то менять в отправляющем ее коде
JavaScript
1
$.post(put_url, data)
или её все же можно превратить обратно в нормальный JSON?

Добавлено через 5 часов 6 минут
Я на всякий случай еще раз поясню, что требуется. Требуется получить в распоряжение содержимое исходного JSON, он начинается так
JSON
1
{"from":{"address":"Россия
Когда я считываю информацию, пришедшую POSTом, это просто набор байтов.
Когда я декодирую его в UTF-8 с помощью .decode('utf-8') получается 'from%5Baddress%5D=%D0%'
Когда я передаю это urllib.parse.unquote, которая должна превращать всякие %5B в нормальные символы, получается 'from[address]=\xd0\xa0'
Вопрос - что делать с unquotнутой строкой, чтобы добиться исходного содержимого?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.10.2015, 17:09
Ответы с готовыми решениями:

Почему, используя модуль requests, нельзя одновременно одним post запросом передать files и json?
import requests files = {fileName: f} json = {'nomer': '99'} ask = requests.post('http://localhost:8080', json=json, files=files) ...

Как отправить json post запросом и принят json в ответ?
Вообщем начал постигать новую windows phone... Решил сразу попытаться наладить общение с сервером. Но вот что то не очень выходит....

Отправка JSON на сервер POST запросом
Как можно отправить JSON на сервер POST запросом. { "jsonrpc": "2.0", "method": "user.authenticate", ...

6
 Аватар для ivlevdenis
21 / 34 / 14
Регистрация: 23.07.2014
Сообщений: 148
14.10.2015, 23:20
Лучший ответ Сообщение было отмечено mr sinister как решение

Решение

JavaScript
1
$.post(put_url, data)
как готовится data? Так же не post не указано что он отправляет json.
Попробуй это:
JavaScript
1
2
3
4
5
6
7
8
9
10
11
$.ajax({
    url: post_url,
    type: 'POST',
    data: JSON.stringify(data),
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    async: false,
    success: function(msg) {
        alert(msg);
    }
});
1
 Аватар для mr sinister
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 49
15.10.2015, 20:32  [ТС]
ivlevdenis, спасибо за совет по заданию параметров POSTинга. Благодаря им всё не-кириллическое в JSONе спокойно переживает передачу. Итак, результатом
Python
1
2
decoded = data.decode('utf-8')
unquoted = urllib.parse.unquote(decoded)
является
JSON
1
{"from":{"address":"\xd0\xa0\xd0
Скажите пожалуйста, каким образом сконвертировать данную строку, чтобы восстановить кириллические символы?
К сожалению, если попытаться её POSTнуть, mod_wsgi вот так ругнётся
tail -n 3 /var/log/apache2/error.log
[:error] File "/usr/lib/python3.4/http/client.py", line 1127, in _send_request
[:error] body = body.encode('iso-8859-1')
[:error] UnicodeEncodeError: 'latin-1' codec can't encode characters in position 20-25: ordinal not in range(256)

Вот весь
Питоновый код, на всякий случай
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import requests
import urllib
 
def application(environ, start_response):
    url = "http://texchange.nowtaxi.ru/api/secret_api_key/"
    query = environ['QUERY_STRING']
 
    if query == "get":
        url += "tariff/list"
        r = requests.get(url)
    else:
        url += "order/put"
        input_len = int(environ.get('CONTENT_LENGTH', '0'))
        data = environ['wsgi.input'].read(input_len)
        decoded = data.decode('utf-8')
        unquoted = urllib.parse.unquote(decoded)
        headers = {'Content-type': 'application/json', 'Accept': 'application/json'}
        r = requests.post(url, data=unquoted, headers=headers)
 
    status = "200 OK"
    response_headers = [('Content-type', 'application/json')]
    start_response(status, response_headers)
 
    return [r.text.encode('utf-8')]
0
 Аватар для ivlevdenis
21 / 34 / 14
Регистрация: 23.07.2014
Сообщений: 148
16.10.2015, 01:12
headers = {'Content-type': 'application/json; charset=utf-8', 'Accept': 'application/json'}
1
 Аватар для mr sinister
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 49
16.10.2015, 22:15  [ТС]
ivlevdenis, Апач все так же ругается (UnicodeEncodeError)
0
 Аватар для ivlevdenis
21 / 34 / 14
Регистрация: 23.07.2014
Сообщений: 148
16.10.2015, 22:18
response_headers = [('Content-type', 'application/json; charset=utf-8')]
1
 Аватар для mr sinister
1 / 1 / 0
Регистрация: 28.01.2014
Сообщений: 49
18.10.2015, 17:14  [ТС]
ivlevdenis, К сожалению, и это не помогло

Добавлено через 1 час 43 минуты
Охохо, дурная моя голова. В общем, не надо ничего никуда декодировать. После ваших советов попробовал просто отсылать считанное из адресной строки data и все получилось.
Во-первых, надо было внимательнее смотреть на объект, возвращаемый API, и выводить все его поля потому что текст ошибки (если она есть) хранится в message, а текст "ок" в поле status.
Во-вторых, не надо было копаться в содержимом, приходящем к апачу, а просто передавать его в исходном виде.
Спасибо вам, товарищ ivlevdenis
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2015, 17:14
Помогаю со студенческими работами здесь

Отправка JSON строки POST запросом
Народ как передать из одного php файл json строку в другой файл. Строку надо передать вот такую...

Post json и не только json запрос по нажатию кнопки
код кнопки: private void materialRaisedButton1_Click(object sender, EventArgs e) { int count =...

Авторизация post-запросом
Необходимо авторизаваться на сайте. string url = "https://xxx.bz/ru/auth/login"; string myParameters =...

Проблема с POST запросом
Есть форма добавления комментария, формируемая php. echo "<a><form method=\"POST\" id=\"addCom\">"; $productId =...

Проблема с POST запросом
Делаю POST запрос инпутами, в нетворке запросы отправлены, а переменные $_POST и $_POST не выводятся через echo.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru