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

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

14.10.2015, 17:09. Показов 6896. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru