Имя: Пароль:
1C
 
HTTP JSON POST
0 Aswed
 
10.03.20
18:30
Пытаюсь отправить данные POST запросом с данными упакованными в JSON

СоединениеHHTP = Новый HTTPСоединение(Хост); //адрес сервера без http

    HTTPЗапрос = Новый HTTPЗапрос;
    
    ЗаписьJSON = Новый ЗаписьJSON;
    МассивДанныхJson = Новый Массив;
    СтруктураДанныхJson = Новый Структура;

    HTTPЗапрос.АдресРесурса = "/client";    
    HTTPЗапрос.Заголовки.Вставить("Authorization",         "Basic ***");
    HTTPЗапрос.Заголовки.Вставить("Content-Type",     "application/x-www-form-urlencoded");
    HTTPЗапрос.Заголовки.Вставить("Accept",             "application/json");
    HTTPЗапрос.Заголовки.Вставить("Connection",         "Keep-Alive");
        
    Запрос = Новый Запрос;
    
    Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
                   |    Контрагенты.Ссылка
                   |ИЗ
                   |    Справочник.Контрагенты КАК Контрагенты";
    
    ЗаписьJSON.УстановитьСтроку();
    
    Выборка = Запрос.Выполнить().Выбрать();
    Пока Выборка.Следующий() Цикл
        СтруктураИнформации = Новый Структура;
        
        СтруктураИнформации.Вставить("type",         0);
        СтруктураИнформации.Вставить("name",         "Тест3");
        СтруктураИнформации.Вставить("code",         "111");
        
        МассивДанныхJson.Добавить(СтруктураИнформации);
        
    КонецЦикла;
    
    СтруктураДанныхJson.Вставить("client", МассивДанныхJson);
    
    ЗаписатьJSON(ЗаписьJSON, СтруктураДанныхJson);
    
    СтрокаJson = ЗаписьJSON.Закрыть();
    
    Сообщить(СтрокаJson);
    
    HTTPЗапрос.УстановитьТелоИзСтроки("param="+СтрокаJson);
    
    ДокументОтвет = "C:\1\TMP.txt";
        
    Попытка
        //Отправляем для обработки на наш сервер
        Ответ = СоединениеHHTP.ОтправитьДляОбработки(HTTPЗапрос, ДокументОтвет);
        
        Сообщить(Ответ.КодСостояния);
    Исключение
        #Если клиент Тогда
           Сообщить(ОписаниеОшибки());
        #КонецЕсли  
    КонецПопытки;


В ответа приходит

[{"field":"code","message":"Необходимо заполнить «Код»."},{"field":"type","message":"Необходимо заполнить «Юр. лицо»."},{"field":"name","message":"Необходимо заполнить «Имя»."}]

Я уже всю голову сломал что ни так. Ткните носом где не верно написано.
1 Cyberhawk
 
10.03.20
18:43
Ну может сервис не объект client на корневом уровне ожидает, а сразу массив?
2 Cyberhawk
 
10.03.20
18:43
Ну и Content-Type зачем такой ставишь? ЖСОН поставь
3 Сияющий в темноте
 
10.03.20
18:56
(2)так он его и посылает,присваивая параметру,а про то,что в этом случае экранирование симаолов не мешало бы сделать,забыл.
4 mzelensky
 
10.03.20
19:10
(0) Программулиной SoapUI попробуй. Там все более наглядно и очевидно
5 Aswed
 
10.03.20
19:21
(1) Я уже и атк пробовал, всё равно эту ошибку валит.
(3) Хмммм, думаешь может помочь?
Бесит то что при тестировании в Postman всё зашибись уходит, но не могу там посмотреть именно структуру JSON.
6 Aswed
 
10.03.20
19:22
(4) Не юзал, там есть вариант посмотреть что именно шлётся в JSON?
7 ДенисЧ
 
10.03.20
19:26
Сейчас мы весь вечер будем телепить спецификацию того, что ожидает получить сервер...
8 Cyberhawk
 
10.03.20
19:27
(5) "Я уже и атк пробовал, всё равно эту ошибку валит" // Ну так это означает, что ты неправильно просто тело передаешь. Тебе оттуда виднее.
9 Cyberhawk
 
10.03.20
19:28
"при тестировании в Postman всё зашибись уходит, но не могу там посмотреть именно структуру JSON" // Покажи каким кодом / параметрами в Постмане все успешно уходит
10 Aswed
 
10.03.20
19:30
СоединениеHHTP = Новый HTTPСоединение(Хост); //адрес сервера без http

    HTTPЗапрос = Новый HTTPЗапрос;
    
    ЗаписьJSON = Новый ЗаписьJSON;
    
    СтруктураДанныхJson = Новый Структура;

    HTTPЗапрос.АдресРесурса = "/api/client";    
    HTTPЗапрос.Заголовки.Вставить("Authorization",         "Basic ****");
    HTTPЗапрос.Заголовки.Вставить("Content-Type",         "application/json");
    HTTPЗапрос.Заголовки.Вставить("Accept",             "application/json");
    HTTPЗапрос.Заголовки.Вставить("Connection",         "Keep-Alive");
        
    Запрос = Новый Запрос;
    
    Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
                   |    Контрагенты.Ссылка
                   |ИЗ
                   |    Справочник.Контрагенты КАК Контрагенты";
    
    ЗаписьJSON.УстановитьСтроку();
    
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        СтруктураИнформации = Новый Структура;
        
        СтруктураИнформации.Вставить("type",         0);
        СтруктураИнформации.Вставить("name",         "Тест3");
        СтруктураИнформации.Вставить("code",         "111");
        
    КонецЕсли;
        
    ЗаписатьJSON(ЗаписьJSON, СтруктураИнформации);
        
    СтрокаJson = ЗаписьJSON.Закрыть();
    
    Сообщить(СтрокаJson);
    
    HTTPЗапрос.УстановитьТелоИзСтроки("param="+СтрокаJson);
    
    ДокументОтвет = "C:\1\TMP.txt";
        
    Попытка
        //Отправляем для обработки на наш сервер
        Ответ = СоединениеHHTP.ОтправитьДляОбработки(HTTPЗапрос, ДокументОтвет);
        
        Сообщить(Ответ.КодСостояния);
    Исключение
        #Если клиент Тогда
           Сообщить(ОписаниеОшибки());
        #КонецЕсли  
    КонецПопытки;

Переписал вот так.
Теперь ругается на синтаксис:

{"name":"Bad Request","message":"Invalid JSON data in request body: Syntax error.","code":0,"status":400,"type":"yii\\web\\BadRequestHttpException"}
11 Aswed
 
10.03.20
19:31
(7) )))))))))))))))))))))))
Да вот была бы у меня эта спецификация, ни приставал бы. там такие уроды это API делали, что млять почти всё на ощупь приходится подбирать. Хорошо хоть URL дали))))
(9) На рабочем компе осталось, завтра скину точно. Но параметры такие же как в коде.
12 ДенисЧ
 
10.03.20
19:35
(11) А теперь вторую половину вечера мы будем тепелепить имя сервиса...
13 Aswed
 
10.03.20
19:38
(12) )))))))))))
Не общедоступный, закрытый) Потому и сделанный так убого.
14 Garykom
 
гуру
10.03.20
19:51
(10) У тебя
"HTTPЗапрос.УстановитьТелоИзСтроки("param="+СтрокаJson);"
ну никак не стыкуется с
"HTTPЗапрос.Заголовки.Вставить("Content-Type",         "application/json");"

Убери это "param="+
15 Aswed
 
10.03.20
19:57
(14) Мля!!!!! Garykom ты попал в точку!!!!!
Именно из-за этой хероты и не работало ни черта!!!
Хотя специально сейчас взял те 5 строчек с описанием API, и там написано что именно через "param=" отправлять!

Спасибо!