Имя: Пароль:
1C
 
ошибка 400 bad request при выполнении POST запроса
0 Vataeka
 
20.09.23
10:28
Добрый день!
Выполняю запрос в POSTMAN все нормально, такой же запрос переношу в 1С возникает ошибка 400 bad request.

Перепробовала разные варианты кодировок, формировать тело запроса через Запись = Новый ЗаписьJSON; ничего не работает. В чем может быть проблема?

Заголовки = Новый Соответствие();
    
    Заголовки.Вставить("Content-Type", "application/json");
    Заголовки.Вставить("Connection", "keep-alive");
    Заголовки.Вставить("Accept", "*/*");
    Заголовки.Вставить("Authorization", "Basic " + ПолучитьBase64СтрокуИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзСтроки(Пользователь +":" +Пароль)));
    
    Попытка                    
        ЗащитаСоединения = Новый ЗащищенноеСоединениеOpenSSL(, Новый СертификатыУдостоверяющихЦентровWindows());
        HTTP_Соединение = Новый HTTPСоединение(АдресЗапроса,443,,,,,ЗащитаСоединения);
        ЗапросHTTP = Новый HTTPЗапрос(ИмяМетода,Заголовки);
    Исключение    
        Сообщить("Не удалось связаться с сервером");
        Сообщение = Новый СообщениеПользователю;
        Сообщение.Текст = КраткоеПредставлениеОшибки(ИнформацияОбОшибке());  
        Сообщение.Сообщить();  
        возврат;
    КонецПопытки;

СтрокаJS =  "{
    |    ""request"": {
    |        ""payload"": {
    |            ""request_id"": ""0bde2079-eded-11ea-952d-00155d01aa22"",
    |            ""document_count"": 1,
    |            ""ags_type"": ""02"",
    |            ""legal_basis"": {
    |                ""code"": ""01"",
    |                ""lack_doc_sign"": ""1""
    |            },
    |            ""ags_requests"": [
    |               {
    |                   ""fl"": {
    |                        ""surname"": ""Иванов"",
    |
    |                      ""name"": ""Иван"",
    |                        ""patronymic"": ""Иванович"",
    |                        ""birthdate"": ""1996-05-10"",
    |                        ""name_changed"": ""1""
    |                    },
    |                    ""doc_id"": ""0bde2079-eded-11ea-952d-00155d01aa21""
    |                }
    |            ]
    |        }
    |    }
    |}";

ЗапросHTTP.УстановитьТелоИзСтроки(СтрокаJS,"CESU-8",ИспользованиеByteOrderMark.НеИспользовать);
ФайлОтвета = ПолучитьИмяВременногоФайла("json");

        
        
        HTTP_Соединение.ОтправитьДляОбработки(ЗапросHTTP, ФайлОтвета);
        //HTTP_Соединение.ВызватьHTTPМетод("POST", ЗапросHTTP, ФайлОтвета);
        Строка = ЗапросHTTP.ПолучитьТелоКакСтроку();  
        
        Ответ = Новый ТекстовыйДокумент();  
        Ответ.Прочитать(ФайлОтвета, КодировкаТекста.UTF8);
        ТекстОтвета = Ответ.ПолучитьТекст();
1 mikecool
 
20.09.23
10:41
проверяй, что в адресе, и что в имени метода
2 Vataeka
 
20.09.23
10:46
я копирую адрес и имя метода из постмана
3 elCust
 
20.09.23
11:01
Необходимо так делать:
Ответ =  HTTP_Соединение.ОтправитьДляОбработки(ЗапросHTTP, ФайлОтвета);

Строка = Ответ.ПолучитьТелоКакСтроку();
4 Donkey_hot
 
20.09.23
11:08
(3) Зачем файл ответа, если планируется получать ответ как строку?
5 Donkey_hot
 
20.09.23
11:08
(0) Сам JSON на валидность проверяли?
6 elCust
 
20.09.23
11:09
(4) Скопировал строку ТС.
7 Lite777888
 
20.09.23
11:12
(0) WinHttp = Новый COMОбъект("WinHttp.WinHttpRequest.5.1");
    WinHttp.SetRequestHeader("Authorization",КлючАПИ);
И тд
Попробовать через вин реквест
8 Vataeka
 
20.09.23
11:13
(3) Сделала без файла ответа, получаю в Строка = "400 Bad Request", в ответ.КодСостояния = 400.
9 Donkey_hot
 
20.09.23
11:13
(6) В любом случае, до получения тела ТСу надо еще дожить, у него код 400, ничего интересного в теле он не найдет.

Мне сильно не нравится, что везде указана куча необязательных параметров. Но поскольку адреса, скопированного из постмана мы не знаем, сказать точнее затруднительно.
10 Vataeka
 
20.09.23
11:14
(7) Никогда такого не видела, буду пробовать. Только вопрос: а как туда тело запроса засунуть?
11 Donkey_hot
 
20.09.23
11:14
(7) Лет 100 уже такое не использую. Зачем ком, если http внутри платформы?
12 Donkey_hot
 
20.09.23
11:15
(10) Не надо это Вам. Адрес ресурса - это секретная информация?
13 Vataeka
 
20.09.23
11:15
(9) адрес не могу скинуть, заголовки скопированы из постмана, пробовала с разными - результат один.
14 Donkey_hot
 
20.09.23
11:16
(13) Ок, он хотя бы http или https (в постмане)?
15 Vataeka
 
20.09.23
11:19
(14) https
16 Lite777888
 
20.09.23
11:19
WinHttp.Open(ВидЗапроса,"https://" + СерверДляЗапроса + "/"+ Метод + "/" );
17 Lite777888
 
20.09.23
11:23
(11) Не  со всеми апи работает , нттп соединение и запрос как практика показывает
18 Donkey_hot
 
20.09.23
11:25
Ну если мы все-таки занимаемся лечением даже не по фотографии, а без нее, то я бы попробовал для начала:
1) убрать всякий хлам из конструкторов (типа Новый Сертификаты...., порта 443, CESU-8, ByteOrderMark и прочего)
2) в заголовках оставить только Content-type (и Authorization, если он действительно необходим, но скопировать значение в явном виде из постмана)
3) Проверить-таки ваш JSON в любом валидаторе
4) Убедиться, что правильно указали секретный адрес(Хост должен быть без указания протокола и слэшей, например "www.example.ru", а ресурс, наоборот, начинаться и, чаще всего, заканчиваться, слэшем, например "/api/my_method/"
19 Donkey_hot
 
20.09.23
11:27
(17) Не сталкивался, хотя интеграций сделал достаточно много. Думаю, в данном кейсе проблема не в этом.
20 Donkey_hot
 
20.09.23
11:29
(18) Еще момент, постман и клиент/сервер с которого отправляете запрос на одной машине?
21 mikecool
 
20.09.23
11:57
как выглядит адрес в 1с?
22 Donkey_hot
 
20.09.23
12:00
(21) Сие тайна...
23 Garykom
 
20.09.23
12:16
АдресЗапроса - имя сервера без http:// ?
ИмяМетода - начинается с / ?
24 Lite777888
 
20.09.23
12:27
(23) адрес типа Сайт.ру ,метод =имя Метода
25 Lite777888
 
20.09.23
12:29
ВидЗапроса -"GET"  "POST"
26 Vataeka
 
20.09.23
13:50
(16) Спасибо Вам огромное! Благодаря вашему совету получила вменяемый ответ! У меня есть еще вопросы: что делать с этим Ком объектом, его нужно как-то закрывать?
27 Vataeka
 
20.09.23
14:05
Еще мне нужно скачать логи запроса, тут я уже использую "GET" и другой метод. Как это сделать через COM?

Вот, что нашла если средствами платформы пользоваться:

Соединение = Новый HTTPСоединение("static.1c.ru");

Запрос = Новый HTTPЗапрос("/images/logo.png");

ПутьДляСохранения = "C:\1.png";

//записываем на диск, так
Ответ = Соединение.Получить(Запрос, ПутьДляСохранения);