Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Python] Передать в POST запросе JSON содержащий кирилицу / 14 сообщений из 14, страница 1 из 1
26.02.2014, 15:55
    #38573109
ivasi89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Python] Передать в POST запросе JSON содержащий кирилицу
Использую 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
26.02.2014, 16:06
    #38573128
BadMF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Python] Передать в POST запросе JSON содержащий кирилицу
Код: 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
26.02.2014, 16:17
    #38573153
BadMF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Python] Передать в POST запросе JSON содержащий кирилицу
на будущее, print уже преобразует в нужную вам кодировку, и если вы при помощи print Не увидели русского текста, то явно сделали лишее преобразование
...
Рейтинг: 0 / 0
27.02.2014, 11:12
    #38573878
ivasi89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Python] Передать в POST запросе JSON содержащий кирилицу
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
27.02.2014, 11:59
    #38573931
BadMF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Python] Передать в POST запросе JSON содержащий кирилицу
если вы не заметили, то я добавил u перед текстом

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

Код: 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
27.02.2014, 12:33
    #38573989
BadMF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Python] Передать в POST запросе JSON содержащий кирилицу
...
Рейтинг: 0 / 0
27.02.2014, 12:41
    #38573997
ivasi89
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Python] Передать в POST запросе JSON содержащий кирилицу
BadMFесли вы не заметили, то я добавил u перед текстом

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



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

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

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

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

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




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

http://docs.python.org/dev/library/urllib.parse.html#urllib.parse.urlencode
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
08.08.2017, 13:30
    #39501833
Tit1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[Python] Передать в POST запросе JSON содержащий кирилицу
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
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [Python] Передать в POST запросе JSON содержащий кирилицу / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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