Имя: Пароль:
1C
 
Проблема с кодировкой текста получаемого из веб-сервиса
,
0 mzelensky
 
05.02.20
08:49
Доброго времени суток!

Имеется некий сторонний http веб-сервис. В моем распоряжении только описание входных параметров и пример ответа. Методом "GET" через "HTTPСоединение" отправляю в него запрос. В ответ получаю "Код возврата = 200" (т.е. типа все ОК) и текст ответа следующего вида:

"�     M�1 �0�2)f�֭[�:�bk��lzxI �]��n� .��}𸗮&�'F��.t9@�6X��G��t�R�87�d�R�v�z�Fm(�o�{򖌪�����-�s���>�#���]��=�H�Z�:�>����E��   "

Перебирал различные кодировки в методе "РезультатHTTPЗапроса.ПолучитьТелоКакСтроку(КодировкаТекста)", но ничего вразумительного так и не увидел.
В заголовках запроса явно указано "HTTPЗаголовки.Вставить("charset", "utf-8");"

Если этот зе запрос послать через программу SoapUI, то ответ отображается абсолютно корректно (читабельно)

Вопрос - в чем косяк с получением данных через 1С-ку? Как добиться адекватного ответа со стороны веб-сервиса?
1 ДенисЧ
 
05.02.20
08:50
сохрани в файл и посмотри побайтно.
2 Кирпич
 
05.02.20
08:53
(1) да текст наверное 1с уже исковеркала. Смотри не смотри
3 mzelensky
 
05.02.20
08:56
(1) и что мне это даст?
4 ДенисЧ
 
05.02.20
08:57
(3) Тебе - ничего. Мне бы - дало.
5 mzelensky
 
05.02.20
09:05
(4) Еще идеи есть?
6 s_newbi
 
05.02.20
09:06
Минут через 40 у компа буду - напишу волшебную строк
7 acht
 
05.02.20
09:09
(5) Продолжай перебирать кодировки.
8 mzelensky
 
05.02.20
09:17
(7) Сдается мне - это тупиковый подход. Я уже пробовал через всяческие декодеры универсальные. Ни один не преобразовал в нужный вид - везде какая-то тарабарщина.

Я вот еще нечто подобное нашел, в этом дело быть не может:

https://webformyself.com/kodirovka-bazy-dannyx-mysql-vyvodim-iz-zapoya-pyushhie-bazy/comment-page-1/

???

Больше всего настораживает факт, что через SoapUI ведь все нормально работает!
9 acht
 
05.02.20
09:18
(0) > В заголовках запроса явно указано "HTTPЗаголовки.Вставить("charset", "utf-8");"

Выброси. Это указание кодировки тела запроса, который ты передаешь. А так как у тебя GET, то смысла в этом нет. Надо указывать "Accept-Charset: utf-8"
10 acht
 
05.02.20
09:20
Ну и RAW view ответа в SoapUI многое тебе расскажет
11 mzelensky
 
05.02.20
09:23
(9) Не помогло
12 mzelensky
 
05.02.20
09:27
(10) Так я по нему и делаю. Вот RAW запроса, который я посылаю

GET [АдресРесурса]/?startDate=20200102&vinOfInterest=TT00068&endDate=20200131 HTTP/1.1
Accept-Encoding: gzip,deflate
Authorization: Bearer jQ1ZkWb4QkThpIaqk
Host: dataaccess.scania.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

Вот что приходит в формате JSon:

{
   "EvaluationStart": "20200102",
   "EvaluationEnd": "20200131",
   "TimeZone": "(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna",
   "MoreDataAvailable": "False",
   "VehicleList": []
}
13 mzelensky
 
05.02.20
09:29
Вот RAW ответа:

HTTP/1.1 200 OK
Date: Wed, 05 Feb 2020 06:24:57 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Server: Kestrel
Content-Encoding: gzip
Vary: Accept-Encoding

{"EvaluationStart":"20200102","EvaluationEnd":"20200131","TimeZone":"(UTC+01:00) Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna","MoreDataAvailable":"False","VehicleList":[]}
14 acht
 
05.02.20
09:33
(12) Попробуй Accept-Encoding: identity

А вообще бери Fiddler, смотри, что ты посылаешь из 1С и проводи одно к другому.
15 mzelensky
 
05.02.20
09:37
(14) ЕСТЬ!!!!!!!!!!!! Помогло:

"HTTPЗаголовки.Вставить("Accept-Encoding", "identity");"

Вот только почему, если даже в SoapUI указано:

"Accept-Encoding: gzip,deflate"

?
16 acht
 
05.02.20
09:40
(15) Потому что SoapUI под капотом умеет разжимать gzip и deflate. Про что честно в этом заголовке и сообщает. Про что сообщает 1С по умолчанию - см Fiddler
17 mzelensky
 
05.02.20
09:43
(16) Огромное спасибо! 2 дня мучений окончены
18 ДенисЧ
 
05.02.20
09:46
"Вот RAW ответа: "
"Content-Encoding: gzip"

Я ж говорю - мне бы помогло )))
19 s_newbi
 
05.02.20
09:51
У меня ответ тоже "нечитаемый" приходил, но 1с через чтениеjson разбирала корректно

ФайлРезультата = ПолучитьИмяВременногоФайла();
HTTPОтвет = HTTP.ОтправитьДляОбработки(запросPOST, ФайлРезультата);
ТекстовыйФайлОтвет = Новый ТекстовыйДокумент;
ТекстовыйФайлОтвет.Прочитать(ФайлРезультата,КодировкаТекста.UTF8);
ОтветСервера = ТекстовыйФайлОтвет.ПолучитьТекст();
        
//разбираем ответ
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ОтветСервера);
Структура = ПрочитатьJSON(ЧтениеJSON);
20 acht
 
05.02.20
09:55
(19) ЧтениеJSON.ОткрытьФайл для слабаков! (:
21 mzelensky
 
05.02.20
10:24
(19) В моем случае код валился на "Структура = ПрочитатьJSON(ЧтениеJSON);".

Сейчас все нормально отрабатывает
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший