Имя: Пароль:
1C
1С v8
Записать в тело HTTP запроса RAW data
0 helloman
 
01.07.22
11:47
Задача: Коллеги, помогите разобраться, необходимо отправить в теле запроса структуру в RAW data, в Postman'e запрос работает. Из 1с возвращает ошибку - нет данных

Структура:
POST /api/********* HTTP/1.1
Host: *************
Authorization: Bearer *******************
Accept: application/json
Content-Type: application/json
Content-Length: 721

{
    "param1": "0",
    "param2": true,
    "css": true,
    "params": [
        {
            "param1_1": 0,
            "param1_2": "t",
            "param1_3": 0
        },
        {
            "param2_1": 0,
            "param2_2": "t",
            "param2_3": 0
        }
    ],
    "param3": "A",
    "param4": "B"
}

Проба пера:

Соединение = Новый HTTPСоединение("**************", 443,,,,,Новый ЗащищенноеСоединениеOpenSSL());    

    АдресРесурса = "/api/*********";    
    ЗаголовкиHTTP = Новый Соответствие;        
    ЗаголовкиHTTP.Вставить("Content-Type", "application/json");
    ЗаголовкиHTTP.Вставить("Accept", "application/json");
    ЗаголовкиHTTP.Вставить("host", "**************");
    
        ЗаголовкиHTTP.Вставить("Authorization", "Bearer " + Токен);
        
    //Укажем длину POST-запроса Content-Length
    ФайлОтправки = Новый Файл(ИмяФайлаОтправки);
    РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
    ЗаголовкиHTTP.Вставить("Content-Length", РазмерФайлаОтправки);
        
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса,ЗаголовкиHTTP);
    
    ДанныеPOST = Новый Структура;
    
    ДанныеPOST.Вставить("param1", "0");
    
    М = Новый Массив;
    ДанныеТовары = Новый Структура;
    ДанныеТовары.Вставить("param1_1",0);
    
    М.Добавить(ДанныеТовары);
    
    
    ДанныеPOST.Вставить("param3", "A");    

    
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();            
    СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, ДанныеPOST, НазначениеТипаXML.Явное);
    РезультатСтрока = ЗаписьJSON.Закрыть();      
    
    HTTPЗапрос.УстановитьТелоИзСтроки(РезультатСтрока, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.Использовать);
1 Kassern
 
01.07.22
11:49
(0) какая ошибка?
2 Kassern
 
01.07.22
11:50
РезультатСтрока в отладчике смотрели? Совпадает с тем что надо передать?
3 Kassern
 
01.07.22
11:51
ЗаголовкиHTTP.Вставить("Accept", "application/json");
    ЗаголовкиHTTP.Вставить("host", "**************");
ЗаголовкиHTTP.Вставить("Content-Length", РазмерФайлаОтправки);
вот это дело имхо можно вообще убрать
4 Kassern
 
01.07.22
11:52
а где кусок кода с отправкой хттп запроса?
5 helloman
 
01.07.22
12:28
(4) РезультатЗапроса = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
6 helloman
 
01.07.22
12:29
(1) 400
{"status":"Error","message":"operation not specified","data":null}
7 helloman
 
01.07.22
12:30
(3) Нужно, без ЗаголовкиHTTP.Вставить("Accept", "application/json"); ругается что нужна эта строка
8 helloman
 
01.07.22
12:32
(2) Подскажите как правильно смотреть?
9 Kassern
 
01.07.22
12:32
(8) Поставить точку останова после РезультатСтрока  и посмотреть в табло, что в ней хранится
10 Kassern
 
01.07.22
12:33
(6) Может надо передать в тело запроса так data=ВашТексJSON?
11 helloman
 
01.07.22
12:38
(10) В Postman это RAW, form-data получилось передать
12 youalex
 
01.07.22
12:39
СериализаторXDTO.ЗаписатьJSON()
Зачем Сериализатор?
13 helloman
 
01.07.22
12:40
(9) Смотрел, там JSON сформировался, в POSTMAN нет JSON - просто текст.
14 helloman
 
01.07.22
12:43
(12) Думал над этим. Пробовал без него через файл
ИмяФайлаОтправки = КаталогВременныхФайлов() + "post.txt";
    ИмяФайлаОтвета = КаталогВременныхФайлов() + "response.txt";
    ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки, КодировкаТекста.ANSI, Символы.ПС, Ложь);
    
    ФайлОтправки.ЗаписатьСтроку("{");
    ФайлОтправки.ЗаписатьСтроку("""param1"": ""0""," + Символы.ПС);
    ФайлОтправки.ЗаписатьСтроку("""params"": ["+ Символы.ПС);
    ФайлОтправки.ЗаписатьСтроку("   {"+ Символы.ПС);
    ФайлОтправки.ЗаписатьСтроку("""param1_1"": 0,"+ Символы.ПС);
    ФайлОтправки.Закрыть();

HTTPЗапрос.УстановитьИмяФайлаТела(имяФайлаОтправки);
РезультатЗапроса = Соединение.ОтправитьДляОбработки(HTTPЗапрос);

Результат такой же
15 Kassern
 
01.07.22
12:44
(14) есть же просто ЗаписатьJson()
16 Kassern
 
01.07.22
12:44
без всяких сериализаторов
17 youalex
 
01.07.22
12:44
(13) у тебя первый фрагмент из Postman?
"{
    "param1": "0",
    "param2": true," .. - это джейсон.
Сериализатор XDTO сериализовал, сериализовал, да не высериализовал.
Он в формате схемы типов 1C сериализует, а тебе же надо обычную структуру, это ЗаписатьJSON() - Глобальный метод
18 Gary417
 
01.07.22
12:44
Чёто давно не брал я в руки шашку....а что в 1С нигде явно не указывается что запрос - POST?
19 helloman
 
01.07.22
12:44
(14) Такой вариант работает если в тело нужно записать form-data, а вот с raw как?
20 youalex
 
01.07.22
12:45
(18) ОтправитьДляОбработки()
21 Kassern
 
01.07.22
12:46
(19) а вы вообще понимаете, что значит RAW data?
22 Kassern
 
01.07.22
12:47
(18) Есть замечательный универсальный метод ВызватьHTTPМетод, где явно прописывается какой метод нужен
23 Gary417
 
01.07.22
12:48
(22) (20) спс
24 Kassern
 
01.07.22
12:48
(17) я же писал ему проверить переменную с итоговой строкой на корректность...
25 helloman
 
01.07.22
12:52
(15) Верно, ошибочка
26 youalex
 
01.07.22
12:56
(24) Терапевт: Ну, на что жалуетесь?
Ветеринар: Как у вас всё просто!
Сори)
27 helloman
 
01.07.22
13:00
Всем спасибо, все заработало