|
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
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |