Вход | Регистрация


1С:Предприятие ::

Метки: 

1С отправка json POST-запросом. Как?

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

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

А так, не?
   tabarigen
 
20 - 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с,то получить тело как строку
   tabarigen
 
22 - 04.09.18 - 11:14
(21) там питон у меня.
Вот как решил.
https://toster.ru/q/559845



Список тем форума
Рекламное место пустует Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Рекламное место пустует