|
Кодировка в REST
|
|||
---|---|---|---|
#18+
Здравствуйте, коллеги. Столкнулись с проблемой при получении данных из REST запроса. Дана JSON строка: Код: javascript 1.
Из нее необходимо получить объект. $$$THROWONERROR(st,##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(%request.Content,,.obj,1)) W obj.Param На выводе: Код: javascript 1.
Посмотрела в описании метода..о кодировке ни слова. Однако в методах обратного преобразования везде указана utf-8. При передаче запроса от REST клиента, в заголовке Content-Type:"text/json; charset=utf-8" Клиент на java, хотя не уверена, что это имеет значение. У меня, к сожалению, нет идей как это исправить. Может кто-то уже работал с этими методами? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 10:41 |
|
Кодировка в REST
|
|||
---|---|---|---|
#18+
phomka , d $system.OBJ.DisplayError(##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject("{""Param"":""русские буквы""}",,.obj,$$$YES)) w obj.ParamРезультат: Код: plaintext 1.
Проверьте содержимое
... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 11:42 |
|
Кодировка в REST
|
|||
---|---|---|---|
#18+
phomka, в подобных ситуациях лучшими друзьями становятся функции extract, ascii и char. Вам почему-то в кодировке UTF-8 пришла строка "фывфывфыв". Вы именно такую задавали? Нужно пройтись по ней extract'ом и для каждого символа посмотреть его код функцией ascii. У Вас будет что-то типа 209, 148, 209, 155, 208, 178 и т.д. А потом набрать в терминале строку русским буквами, сохранить ее в какой-то переменной, убедиться, что райтом она нормально отображается и посмотреть коды ее байт. Затем сравнить и попытаться объяснить разницу. Когда-то в особо тяжелых случаях я на основании этого анализа просто писал свой конвертор да и всё, но сейчас, думаю, в таком радикальном решении уже нет необходимости, ибо в Cache уже достаточно "рулей", которые Вам указал servit, чтобы решить проблему "малой кровью". ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 11:58 |
|
Кодировка в REST
|
|||
---|---|---|---|
#18+
4@%CSP.BinaryStream text/json UTF-8 И они одинаковы, если я просто вставлю запрос в виде строки, или если получу от клиента. А выводятся по разному. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 12:13 |
|
Кодировка в REST
|
|||
---|---|---|---|
#18+
EvLaUy, да, строка там была другая - немного схалтурила... Воспользуюсь советом, отпишусь что получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 12:17 |
|
Кодировка в REST
|
|||
---|---|---|---|
#18+
EvLaUy, Хотя, получается, что проблема в %request.Content... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 12:23 |
|
Кодировка в REST
|
|||
---|---|---|---|
#18+
Мне сложно сказать в чем проблема, у меня сейчас нет под рукой cache. Может быть, всё дело в том, как Вы задаете эту строку перед отправкой запроса? Если это Java, попробуйте задать ее в кодах utf-8. Что-то типа "ĒİŁ\u14f", это кажется строка "Вася". Посмотрите, поможет ли. Во всяком случае, будет уверенность, что она уходит именно в кодировке utf-8. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 12:33 |
|
Кодировка в REST
|
|||
---|---|---|---|
#18+
phomka4@%CSP.BinaryStreamТо, что это поток, и так понятно: каково его содержимое? ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject("4@%CSP.BinaryStream",,.obj,1) выдаст ошибку Код: plaintext
, так же как и ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(%request.Content,,.obj,1) должен выдать эту же ошибку, так как на вход метода ожидается строка, а Вы передаёте поток. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 13:00 |
|
Кодировка в REST
|
|||
---|---|---|---|
#18+
Насколько я понимаю, сейчас %request.Content игнорирует заголовок ContentType. То есть вам нужно самой смотреть значение %request.Content.ContentType и в зависимости от charset преобразовывать строку во внутренний формат Caché. Например, из UTF-8 можно преобразовать следующей командой (первый 100 знаков):Set str = $ZCVT(%request.Content.Read(100),"I","UTF8") или таким образом:if $isobject(%request.Content) { Set %request.Content.Attributes("CharEncoding")="UTF8" Set stream=##class(%IO.MetaCharacterStream).%New(%request.Content) Set ^lastRequestContent = stream.Read() } Заметьте, что %request.Content типа %CSP.BinaryStream, то есть это бинарный, а не символьный поток. ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject может принимать на вход и строки и потоки. http://docs.intersystems.com/cache20141/csp/documatic/%CSP.Documatic.cls?PAGE=CLASS&LIBRARY=%SYS&CLASSNAME=%ZEN.Auxiliary.jsonProvider#%ConvertJSONToObject ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 13:44 |
|
Кодировка в REST
|
|||
---|---|---|---|
#18+
phomka , Код: plaintext 1.
соответственно Код: plaintext 1.
Итого где-то происходит конвертация в кодировку Windows-1251. PS: какую версию Caché используете: Unicode или 8-битную? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 13:45 |
|
Кодировка в REST
|
|||
---|---|---|---|
#18+
Александр Коблов%ConvertJSONToObject может принимать на вход и строки и потоки.Ценное замечание: по сигнатуре метода и соответственно подсказке кода этого и не скажешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2014, 13:57 |
|
Кодировка в REST
|
|||
---|---|---|---|
#18+
Коллеги, спасибо! Я вчера все прочитала и все сделала. Очень ценные советы. servit, использую 8-битную версию. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2014, 04:08 |
|
Кодировка в REST
|
|||
---|---|---|---|
#18+
phomkaУ меня, к сожалению, нет идей как это исправить.В будущих версиях можно будет включить автоматическую конвертацию тела запроса, а пока можно воспользоваться следующим кодом: If $IsObject(%request.Content),$zcvt(%request.Content.ContentType,"L")["charset=utf-8" { Set contentTmp=%request.Content.%ConstructClone(-1) Set contentTmp.Attributes("CharEncoding")="UTF8" ; сохраняем переданные атрибуты Merge attr=%request.Content.Attributes Do %request.Content.Clear() Merge %request.Content.Attributes=attr Do %request.Content.CopyFrom(##class(%IO.MetaCharacterStream).%New(contentTmp)) }, который лучше поместить в метод OnPreDispatch . Далее работаете с %request.Content как обычно. PS: спасибо Александр Коблов за наводку на %IO.MetaCharacterStream. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.07.2015, 09:09 |
|
|
start [/forum/topic.php?fid=39&msg=38622894&tid=1556570]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
30ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 137ms |
0 / 0 |