Имя: Пароль:
1C
 
1С отправка json POST-запросом. Как?
,
0 tabarigen
 
03.09.18
14:50
На текущий момент реализовано так.

Функция ОповеститьСервер(ФайлПрайса, URLСайта, Ресурс) Экспорт
    
HTTP =  Новый HTTPСоединение(URLСайта,8000);     //Адрес сайта и порт если потребуется. пример - http://localhost:8000
    запросPOST = Новый HTTPЗапрос();
    запросPOST.АдресРесурса = Ресурс;                // адрес url веб-сервиса http://localhost:8000/api/v1/datafill/
    запросPOST.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
    запросPOST.УстановитьИмяФайлаТела(ФайлПрайса);  
    
    Попытка
    //Отправляем для обрааботки на наш сервер
        ФайлРезультата = ПолучитьИмяВременногоФайла();
        HTTP.ОтправитьДляОбработки(запросPOST, ФайлРезультата);
        ТекстовыйФайлОтвет = Новый ТекстовыйДокумент;
        ТекстовыйФайлОтвет.Прочитать(ФайлРезультата,КодировкаТекста.UTF8);
        ОтветСервера = ТекстовыйФайлОтвет.ПолучитьТекст();
        ЗаписьЖурналаРегистрации(ИмяСобытияЖР, УровеньЖурналаРегистрации.Информация, , , "Ответ сервера: " + ОтветСервера);    
    Исключение
        ЗаписьЖурналаРегистрации(ИмяСобытияЖР, УровеньЖурналаРегистрации.Ошибка, , , "Ответ сервера: " + ОписаниеОшибки());
    КонецПопытки;
    
    Возврат ОтветСервера;
    
КонецФункции

POST запрос приходит на веб-сервис, но ни в request.body и request.POST нет данных JSON.

http://forum.aeroion.ru/topic446.html
эту ветку активно курил, но немного запутался в основах http-запросов.
Мне нужно передать JSON в тело запроса или передать как параметр POST. Во второму случае мне нужно JSON конвертировать в строку. Что кстати тоже я пока не смог.
В общем ребят подскажите, куда копать.
1 Lexey_
 
03.09.18
15:06
(0) "мне нужно JSON конвертировать в строку"
JSON это строка
2 youalex
 
03.09.18
15:06
(0) json это и есть строка.
Кури ПрочитатьJSON(), ЗаписатьJSON() - там все просто
3 Borteg
 
03.09.18
15:08
(0)   запросPOST.Заголовки.Вставить("Content-type", "application/x-www-form-urlencoded;charset=utf-8"); почему?
4 sandal_r
 
03.09.18
15:09
json надо установить в тело запроса.
5 youalex
 
03.09.18
15:11
(4) УстановитьИмяФайлаТела(ФайлПрайса)  - это разве не оно?
6 Borteg
 
03.09.18
15:11
(5) а что там в файлпрайса?)
7 Borteg
 
03.09.18
15:14
(0) ("Content-Type", "application/json");
8 youalex
 
03.09.18
15:16
(6) Согласен, утверждение в (4)  - истинно)

(0) меня вот это смущает в запросPOST.АдресРесурса:
http://localhost:8000/api/v1/datafill/
я обычно пишу относительный путь, т.е. "/api/v1/datafill/", но может и так можно...
9 Borteg
 
03.09.18
15:17
(8) из всего что там написано, очевидная ошибка только в заголовках) все остальное скрыто в странных переменных)
10 Вафель
 
03.09.18
15:21
скорее вего бом виноват
11 tabarigen
 
03.09.18
15:25
(6) путь к сформированному файлу json
12 Borteg
 
03.09.18
15:26
(11) заголовок поменяй см 7 +добавь свой чарсет
13 tabarigen
 
03.09.18
15:30
(12) сделал. не помогло. что странно, то данные приходят, что видно на скрине.
https://yadi.sk/d/btCWbt0u3aotJ4
14 Borteg
 
03.09.18
15:33
(13) а как формируется файл прайса?
15 tabarigen
 
03.09.18
15:34
(14) Запись = Новый ЗаписьJSON;
    ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON( ,Символы.Таб);
    Запись.ОткрытьФайл("D:\temp\pills.json",,,ПараметрыЗаписиJSON);
    
    НастройкиСериализации = Новый НастройкиСериализацииJSON;
    НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO;
    НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДата;
    
    Данные = Новый Структура;
    Данные.Вставить("pharmacyCode", ИдАптеки);
    Данные.Вставить("pills", ТабЗначВМассив(Рез));
    Данные.Вставить("dateCreate", ТекущаяДата());
    
    
    Попытка
        ЗаписатьJSON(Запись, Данные, НастройкиСериализации);
        Запись.Закрыть();
        Возврат Истина;
    Исключение
        ЗаписьЖурналаРегистрации(ИмяСобытияЖР,УровеньЖурналаРегистрации.Ошибка,,,"Прайс не сформирован, произошла ошибка " + ОписаниеОшибки());
        Возврат Ложь;
    КонецПопытки;
16 VitShvets
 
03.09.18
16:12
(13) А в файл писать это так задумано? Можно же без файловой операции:
ТекЗаписьJSON = Новый ЗаписьJSON;
ТекЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ТекЗаписьJSON , СтруктураДанных);
ТекстJSON = ТекЗаписьJSON.Закрыть();
17 tabarigen
 
03.09.18
16:20
(16) Да так задумано. потом может перепишу иначе.
Сейчас мне галвное понять, почему не доходят данные. Самое смешное что утром все работало((
Потом, что то дописал, тут  да там, и отвалилось. А восстановить к рабочему состоянию пока не получается
18 VitShvets
 
03.09.18
16:31
В файле может быть дело. Для клиента и сервера D:\Temp\ разные. Можно попробовать через абсолютную шару \\sever\Temp\. Но вообще я так делаю, работает:
СтруктураДанных = Новый Структура;
СтруктураДанных.Вставить(....

ТекЗаписьJSON = Новый ЗаписьJSON;
ТекЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ТекЗаписьJSON , СтруктураДанных);
ТекстJSON = ТекЗаписьJSON.Закрыть();

HTTP =  Новый HTTPСоединение("site.ru",8080);
запросPOST = Новый HTTPЗапрос();
запросPOST.АдресРесурса = "/api/v1/datafill"; // Относительный путь. Обязательно.
запросPOST.Заголовки.Вставить(...
запросPOST.УстановитьТелоИзСтроки(ТекстJSON, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
HTTPОтвет    = HTTP.ОтправитьДляОбработки(запросPOST);
ОтветСервера = HTTPОтвет.ПолучитьТелоКакСтроку();

Чтение = Новый ЧтениеJSON;
Чтение.УстановитьСтроку(ОтветСервера);
Объект = ПрочитатьJSON(Чтение, Истина);

Готово. На выходе [Объект] это соответствие с разоббраным json ответом сервера.
19 Garikk
 
03.09.18
16:36
(0) ээм
запросPOST.Заголовки.Вставить("Content-type", "application/json;charset=utf-8");

А так, не?
20 tabarigen
 
04.09.18
10:21
В общем пока оставил так.
Функция ОповеститьСервер(ФайлПрайса, URLСайта, Ресурс) Экспорт
    
    ФайлОтправки = Новый Файл(ФайлПрайса);
    РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер());
    
    ЗаголовокЗапросаHTTP = Новый Соответствие();
    // Передаем в заголовках размер и тип данных на отправку
    ЗаголовокЗапросаHTTP.Вставить("Content-Length", РазмерФайлаОтправки);
    ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=utf-8");
    HTTP =  Новый HTTPСоединение(URLСайта,8000);     //Адрес сайта и порт если потребуется. пример - http://localhost:8000
    запросPOST = Новый HTTPЗапрос(Ресурс, ЗаголовокЗапросаHTTP);          // адрес url веб-сервиса /api/v1/datafill/
    запросPOST.УстановитьИмяФайлаТела(ФайлПрайса);
    
    Попытка
    //Отправляем для обрааботки на наш сервер
        ЗаписьЖурналаРегистрации(ИмяСобытияЖР, УровеньЖурналаРегистрации.Информация, , , "Начало отправки запроса");        
        ФайлРезультата = ПолучитьИмяВременногоФайла();
        HTTPОтвет = HTTP.ОтправитьДляОбработки(запросPOST, ФайлРезультата);
        ТекстовыйФайлОтвет = Новый ТекстовыйДокумент;
        ТекстовыйФайлОтвет.Прочитать(ФайлРезультата,КодировкаТекста.UTF8);
        ОтветСервера = ТекстовыйФайлОтвет.ПолучитьТекст();
        ОтветСервера = HTTPОтвет.ПолучитьТелоКакСтроку();
        ЗаписьЖурналаРегистрации(ИмяСобытияЖР, УровеньЖурналаРегистрации.Информация, , , "Ответ сервера: " + ОтветСервера);    
    Исключение
        ЗаписьЖурналаРегистрации(ИмяСобытияЖР, УровеньЖурналаРегистрации.Ошибка, , , "Ответ сервера: " + ОписаниеОшибки());
    КонецПопытки;
    
    Возврат ОтветСервера;
    
КонецФункции

JSON  приходит в теле запроса, мне нужно было только верно его считать на веб-сервисе.
21 Сияющий в темноте
 
04.09.18
11:10
на сервере,если там php,то можно RawPostData посмотреть.
Если хттп сервис 1с,то получить тело как строку
22 tabarigen
 
04.09.18
11:14
(21) там питон у меня.
Вот как решил.
https://toster.ru/q/559845
Есть два вида языков, одни постоянно ругают, а вторыми никто не пользуется.