Имя: Пароль:
1C
 
http post запрос. Какая-то ерунда
, ,
0 mr_K
 
26.01.21
13:32
С каких-то "лохматых" годов, для HTTP запросов использовал WinHttp.WinHttpRequest.5.1
Все было отлично, все работало. Сейчас столкнулся с ситуацией, что в ответе, русские символы "закодированы". Разработчик сервиса, говорит что никакую кодировку явно не указывает, типа должно быть utf-8. Наверное.
Делаю так:
WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2,"utf-8");
WinHttp.SetTimeouts(60000, 60000, 60000, 60000);

WinHttp.Open("POST", АдресСервера + АдресРесурса,0);
WinHttp.SetRequestHeader("Accept-Language", "ru");
WinHttp.SetRequestHeader("Accept-Charset", "utf-8");
WinHttp.setRequestHeader("Content-Language", "ru");  
WinHttp.setRequestHeader("Content-Charset", "utf-8");
WinHttp.setRequestHeader("Content-type", "application/json");
WinHttp.setRequestHeader("ApiToken", Токен);
WinHttp.Send(СтрокаЗапроса);

попробовал перейти на нативные методы 1С :)
Делаю так:
HTTPСоединение = Новый HTTPСоединение(АдресСервера);
HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
HTTPЗапрос.Заголовки.Вставить("Accept-Language", "ru");
HTTPЗапрос.Заголовки.Вставить("Accept-Charset", "utf-8");
HTTPЗапрос.Заголовки.Вставить("Content-Language", "ru");
HTTPЗапрос.Заголовки.Вставить("Content-Charset", "utf-8");
HTTPЗапрос.Заголовки.Вставить("Content-type", "application/json");
HTTPЗапрос.Заголовки.Вставить("ApiToken", Токен);
    
HTTPЗапрос.УстановитьТелоИзСтроки(СтрокаЗапроса, КодировкаТекста.UTF8);
Ответ = HTTPСоединение.ОтправитьДляОбработки(HTTPЗапрос);

В результате в Ответ.ПолучитьТелоКакСтроку("UTF-8") - пустая строка.

Тут два вопроса:
1. Что я делаю не так с HTTPСоединение.
2. Как бы мне кодировку победить в WinHttpRequest

Заранее спасибо
1 ДенисЧ
 
26.01.21
13:33
А если не указывать кодировку в ПолучитьТелоКакСтроку ?
В заголовках ответа что?
2 mr_K
 
26.01.21
13:36
(1) В заголовках Ответа есть вот такое: "Transfer-Encoding" "chunked"
Ответ.ПолучитьТелоКакСтроку() -то же пустая строка
3 mr_K
 
26.01.21
14:26
По поводу кодировки: декодер говорит, что исходная кодировка Utf-8, отображаемая Windows-1252. В таком варианте текст становится нормальной кириллицей
4 mr_K
 
26.01.21
15:39
Декодирую через COMОбъект("Adodb.Stream").
Пытаюсь подобрать исходную и новую кодировку. Ничего не подходит :)
Хотя вот этот сайт https://2cyr.com/decode/?lang=ru подбирает несколько вариантов, при которых текст становится читаемым. Но и они не подходят...
Прям бложек организовал :).
Коллеги, может быть есть идеи, как эти кодировки побороть?
5 mr_K
 
26.01.21
15:42
Кто сможет подсказать, как привести вот такую строку:
Соединение фланцевое Ду50, Ру25 РДАМ.711142.029
в нормальный кириллический вид?
Ожидаю получить вот такое:
Соединение фланцевое Ду50, Ру25 РДАМ.711142.029
6 Cthulhu
 
26.01.21
15:47
7 Kassern
 
26.01.21
15:50
поставь Fiddler и попробуй через него запрос прогнать, посмотри какой ответ будет и в какой кодировке
8 mr_K
 
26.01.21
15:52
(6) мммм...И?
Могу сказать, что коды КодСимвола() моих "кракозябр" лежат в районе 200. +/-. Коды кириллицы - 1000 с чем-то
(7) через фидлер пускали на компе разработчика сервиса. Мы с ним и с сервисом в одной сетке находимся, так что не принципиально. Кодировка utf-8. Ответ приходит читаемый
9 Kassern
 
26.01.21
16:01
(8) Заголовки один в один сделали? ресурс https?
10 Kassern
 
26.01.21
16:06
Вот тебе кусок кода с озоном, как пример пост запроса, может поможет)
Ресурс="api-seller.ozon.ru";    
        Заголовки=Новый Соответствие;
        Заголовки.Вставить("Content-Type", "application/json");
        Заголовки.Вставить("Client-Id",ИДКлиента);
        Заголовки.Вставить("Api-Key",Ключ);
        ssl = Новый ЗащищенноеСоединениеOpenSSL( неопределено, неопределено );
        Соединение=Новый HTTPСоединение("api-seller.ozon.ru",,,,,,ssl);
        Запрос=Новый HTTPЗапрос("/v2/posting/fbo/list",Заголовки);
        ЗаписьJSON=Новый ЗаписьJSON;
        ЗаписьJSON.УстановитьСтроку();
        ЗаписьJSON.ЗаписатьНачалоОбъекта();
        ЗаписьJSON.ЗаписатьИмяСвойства("dir");
        ЗаписьJSON.ЗаписатьЗначение("asc");
        ЗаписьJSON.ЗаписатьИмяСвойства("filter");
        ЗаписьJSON.ЗаписатьНачалоОбъекта();
        ЗаписьJSON.ЗаписатьИмяСвойства("since");
        ЗаписьJSON.ЗаписатьЗначение(ДатаНачала);
        ЗаписьJSON.ЗаписатьИмяСвойства("to");
        ЗаписьJSON.ЗаписатьЗначение(ДатаОкончания);
        ЗаписьJSON.ЗаписатьИмяСвойства("status");
        ЗаписьJSON.ЗаписатьЗначение("delivered");
        ЗаписьJSON.ЗаписатьКонецОбъекта();
        ЗаписьJSON.ЗаписатьИмяСвойства("limit");
        ЗаписьJSON.ЗаписатьЗначение(50);
        ЗаписьJSON.ЗаписатьИмяСвойства("offset");
        ЗаписьJSON.ЗаписатьЗначение(0);
        ЗаписьJSON.ЗаписатьКонецОбъекта();
        Результат=ЗаписьJSON.Закрыть();
        Запрос.УстановитьТелоИзСтроки(Результат);
        Ответ=Соединение.ВызватьHTTPМетод("POST",Запрос);
        Поток=Ответ.ПолучитьТелоКакПоток();
        ЧтениеJSON=Новый ЧтениеJSON;
        ЧтениеJSON.ОткрытьПоток(Поток);
        Соответствие=ПрочитатьJSON(ЧтениеJSON);
        ЧтениеJSON.Закрыть();
        Поток=Неопределено;
        Запрос=Неопределено;
11 mr_K
 
26.01.21
16:08
ресурс просто http. Заголовки - в фидлере вообще только авторизацию и Content-type прописываешь и все ок.
(10) О, работе с телом как потоком не пробовал. Не знаю поможет ли, но в любом случае спасибо!
12 Kassern
 
26.01.21
16:09
(11) убери лишние заголовки, оставь, которые в фидлере сканали
13 mr_K
 
26.01.21
16:16
(12) Что в лоб, что по лбу)))) Лишние заголовки были действительно лишними, но без них результат тот же.
Через поток - совсем никак. "Недопустимое состояние потока записи JSON"
14 Kassern
 
26.01.21
16:17
(13) код ответа какой?
15 mr_K
 
26.01.21
16:21
Код состояния в Ответе - 307
16 mr_K
 
26.01.21
16:36
УРРААААА. Подобрал.)))
Всем спасибо!
17 Вафель
 
26.01.21
17:16
дело было в БОМ?
18 mr_K
 
26.01.21
17:21
(17). Не, я с него начал эксперименты.
Кодировку ИЗ и В подобрал для Stream.