powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Python] Передать в POST запросе JSON содержащий кирилицу
14 сообщений из 14, страница 1 из 1
[Python] Передать в POST запросе JSON содержащий кирилицу
    #38573109
ivasi89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использую API Яндекс Маркета
Вот метод http://api.yandex.ru/market/partner/doc/dg/reference/post-campaigns-id-bids.xml
Подаю на вход JSON содержащий кириллицу получаю пустой JSON.

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
val = json.dumps({'offers' : [{'name': 'Принтер Panasonic HX-DC3EE White'}]}, ensure_ascii=False)
print(val)
values = val.encode('utf_8')
print(values)
url = 'https://api.partner.market.yandex.ru/v2/campaigns/%d/bids.json' % (idcom)
reg = urllib.request.Request(url, method='POST')
reg.add_header('Content-Type', 'application/json')
reg.add_header('Host', 'api.partner.market.yandex.ru')
reg.add_header('Authorization','OAuth oauth_token="", oauth_client_id="", oauth_login=""')
reg.add_data(values)
try:
        response =  urllib.request.urlopen(reg)
        json_data=response.read().decode("utf8", 'ignore')
        dataj = json.loads(json_data)
        print(dataj)
except  urllib.error.HTTPError as error:
       
        print(error.read())



{"offers": [{"name": "Принтер Panasonic HX-DC3EE White"}]}
b'{"offers": [{"name": "\xd0\x9f\xd1\x80\xd0\xb8\xd0\xbd\xd1\x82\xd0\xb5\xd1\x80 Panasonic HX-DC3EE White"}]}'

Ответ от сервера:

{'bids': []}

Python 3.3
...
Рейтинг: 0 / 0
[Python] Передать в POST запросе JSON содержащий кирилицу
    #38573128
BadMF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: python
1.
2.
3.
val = json.dumps({'offers' : [{'name': u'Принтер Panasonic HX-DC3EE White'}]}, ensure_ascii=False)
print(val)
#уберите это, пишите сразу в utf ---------values = val.encode('utf_8')-------------



у вас происходит двойное преобразование в ютфв следствии чего вы запрашиваете не
Принтер Panasonic HX-DC3EE White
а
\xcf\xf0\xe8\xed\xf2\xe5\xf0 Panasonic HX-DC3EE White

Код: python
1.
2.
3.
4.
5.
6.
>>> val = json.dumps({'offers' : [{'name': u'Принтер Panasonic HX-DC3EE White'}]}, ensure_ascii=False)
>>> val
u'{"offers": [{"name": "\xcf\xf0\xe8\xed\xf2\xe5\xf0 Panasonic HX-DC3EE White"}]}'
>>> val2 = val.encode('utf-8')
>>> val2
'{"offers": [{"name": "\xc3\x8f\xc3\xb0\xc3\xa8\xc3\xad\xc3\xb2\xc3\xa5\xc3\xb0 Panasonic HX-DC3EE White"}]}'


чувствуете разницу?
...
Рейтинг: 0 / 0
[Python] Передать в POST запросе JSON содержащий кирилицу
    #38573153
BadMF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на будущее, print уже преобразует в нужную вам кодировку, и если вы при помощи print Не увидели русского текста, то явно сделали лишее преобразование
...
Рейтинг: 0 / 0
[Python] Передать в POST запросе JSON содержащий кирилицу
    #38573878
ivasi89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Python 3.3
Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
# coding: utf-8
values = """{'offers' : [{'name': "Принтер Panasonic HX-DC3EE White"}]}"""
print(values)
url = 'https://api.partner.market.yandex.ru/v2/campaigns/%d/bids.json' % (idcom)
reg = urllib.request.Request(url, method='POST')
reg.add_header('Content-Type', 'application/json')
reg.add_header('Host', 'api.partner.market.yandex.ru')
reg.add_header('Authorization','OAuth oauth_token="", oauth_client_id="", oauth_login=""')
reg.add_data(values)
try:
        response =  urllib.request.urlopen(reg)
        json_data=response.read().decode("utf8", 'ignore')
        dataj = json.loads(json_data)
        print(dataj)
except  urllib.error.HTTPError as error:
       
        print(error.read())



{'offers' : [{'name': "Принтер Panasonic HX-DC3EE White"}]}

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

На входе должен быть тип bytes если сделать encode('utf-8') то получится, как в первом варианте.
...
Рейтинг: 0 / 0
[Python] Передать в POST запросе JSON содержащий кирилицу
    #38573931
BadMF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если вы не заметили, то я добавил u перед текстом

Код: python
1.
val = u'Текс'
...
Рейтинг: 0 / 0
[Python] Передать в POST запросе JSON содержащий кирилицу
    #38573954
BadMF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и ещё:

Код: python
1.
2.
3.
4.
5.
6.
>>> val = """{'offers' : [{'name': "Принтер Panasonic HX-DC3EE White"}]}"""
>>> type(val)
<type 'str'>
>>> values = {u'offers' : [{u'name': u'Принтер Panasonic HX-DC3EE White'}]}
>>> type(values)
<type 'dict'>
...
Рейтинг: 0 / 0
[Python] Передать в POST запросе JSON содержащий кирилицу
    #38573989
BadMF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
[Python] Передать в POST запросе JSON содержащий кирилицу
    #38573997
ivasi89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BadMFесли вы не заметили, то я добавил u перед текстом

Код: python
1.
val = u'Текс'



Это верно для Python v.2
...
Рейтинг: 0 / 0
[Python] Передать в POST запросе JSON содержащий кирилицу
    #38574191
BadMF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivasi89,

спс, не знал.
...
Рейтинг: 0 / 0
[Python] Передать в POST запросе JSON содержащий кирилицу
    #38589418
ivasi89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UP
...
Рейтинг: 0 / 0
[Python] Передать в POST запросе JSON содержащий кирилицу
    #38589526
BadMF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы помог, но ради вашей задачки совсем нет желания ставить питон 3.3
а на 2.7 такое urllib.request.Request невозможно. Точнее возможно, но немного сложнее и мне лень.
Проблема у вас в том, что параметр values передаваемый в строке reg.add_data(values) имеет тип str, о чём я вам уже писал раньше, в то время как для POST данных необходимы бинарные данные.

Так же я вам кидал ссылку на документацию по urllib и конкретно подготовку данных для отпарвки методом POST.

Ничего из этого вам не помогло чтоли?
...
Рейтинг: 0 / 0
[Python] Передать в POST запросе JSON содержащий кирилицу
    #38589614
ivasi89
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BadMFПроблема у вас в том, что параметр values передаваемый в строке reg.add_data(values) имеет тип str, о чём я вам уже писал раньше, в то время как для POST данных необходимы бинарные данные.

Код: python
1.
values = val.encode('utf_8') -Бинарные данные.




Документация говорит, что values должен быть в формате "application/x-www-form-urlencoded format"
...
Рейтинг: 0 / 0
[Python] Передать в POST запросе JSON содержащий кирилицу
    #38590141
BadMF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну в том разделе что я скинул вам есть же ссылка на функцию urllib.parse.urlencode()

http://docs.python.org/dev/library/urllib.parse.html#urllib.parse.urlencode
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
[Python] Передать в POST запросе JSON содержащий кирилицу
    #39501833
Tit1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BadMF, Вы знаете как это
s = 'http://go.mail.ru/search?fm=1&q=' quote(z)
doc = urllib.request.urlopen(s).read().decode('cp1251',errors='ignore')
сделать в Python 2.7.13 без urllib.request ?
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Python] Передать в POST запросе JSON содержащий кирилицу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]