|   |   | 
| 
 | Отладка http-запроса из Postman | ☑ | ||
|---|---|---|---|---|
| 0
    
        Никулин Леонид 27.06.24✎ 15:39 | 
        Добрый день!
 Есть HTTP-сервис. По условию задачи есть сторонняя база, которая будет обращаться к моему HTTP-сервису и получать ответ. В теле запроса JSON и произвольное количество файлов. Есть на ИТСе готовый пример https://its.1c.ru/db/metod8dev/content/5917/hdoc Взял его и в 1С сделал тестовую отправку запроса самому себе. отправляю. Получаю. Запрос читается. Всё ок. Теперь тот же запрос нужно отправить из Постмена. Отправляю. Получаю. Читаю заголовки и тело. Алгоритм тот же. С заголовками всё норм, а вот с телом беда. Тело передаю как двоичные данные. Вот оно упорно не хочет читаться(( Может я где-то с настройками постмена косячу? Если есть соображения буду рад. Спасибо. | |||
| 1
    
        Смотрящий 27.06.24✎ 15:40 | 
        Тело перед отправкой в base64 загоняй     | |||
| 2
    
        n0ther 27.06.24✎ 15:46 | 
        (1) магистр йода в посте     | |||
| 3
    
        Никулин Леонид 27.06.24✎ 15:48 | 
        (1) из 1С у меня без этого работает. Ну да ладно. А как это делается в постмене?     | |||
| 4
    
        Смотрящий 27.06.24✎ 15:49 | 
        (3) "перед отправкой" из твоего http-сервиса     | |||
| 5
    
        Никулин Леонид 27.06.24✎ 15:57 | 
        Возможно плохо описал проблему. Попробую еще раз. Я отправляю из Постмена запрос. На стороне постмена не знаю как кодировать тело в base64. На стороне http-сервиса получаю запрос и читаю тело. Тут бяка при чтении. Не совсем Вас понял. Опишите, пожалуйста, чуть более подробно что нужно сделать?     | |||
| 6
    
        Смотрящий 27.06.24✎ 15:59 | 
        На стороне постмана ничего делать не надо.
 В сервисе оберни в json твоем Двоичные данные в Base64Строка | |||
| 7
    
        Никулин Леонид 27.06.24✎ 16:01 | 
        А понял. Ну в примерах нигде так не делают просто. Попробую. Спасибо за комментарий!     | |||
| 8
    
        OldCondom 27.06.24✎ 16:09 | ||||
| 9
    
        Никулин Леонид 27.06.24✎ 16:16 | 
        Всё же ума у меня не хватает. Я могу конечно из ДвоичныхДанных получить строку в формате Base64, но что с ней дальне делать? Не соображу. Покажу код на стороне сервиса при чтении запроса. Так будет более наглядно:
 &НаСервере Функция ПрочитатьСообщение(Тело, Разделитель) //Тело - ДвоичныеДанные //Разделитель - Строка с разделителем Маркеры = Новый Массив(); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель)); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель + Символы.ПС)); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель + Символы.ВК)); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель + Символы.ВК + Символы.ПС)); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель + "==")); текст = Неопределено; изображение1 = Неопределено; изображение2 = Неопределено; Стр = Base64Строка(Тело); //и что с этим делать? ЧтениеДанных работает с ДвоичнымиДанными ЧтениеДанных = Новый ЧтениеДанных(Тело); ЧтениеДанных.ПропуститьДо(Маркеры); ОбщийБуферДвоичныхДанных = ЧтениеДанных.ПрочитатьВБуферДвоичныхДанных(); БуферыДвоичныхДанных = ОбщийБуферДвоичныхДанных.Разделить(Маркеры); СтруктураРаспознанногоСообщения = Новый Структура; Сч = 1; Для Каждого Буфер Из БуферыДвоичныхДанных Цикл Поток = новый ПотокВПамяти(Буфер); ЧтениеЧасти = Новый ЧтениеДанных(Поток); ДД = ЧтениеЧасти.Прочитать().ПолучитьДвоичныеДанные(); Если ДД.Размер() = 0 Тогда Продолжить; //Вот сюда попадаю(( КонецЕсли; СтруктураРаспознанногоСообщения.Вставить("ФайлВариантДва" + Сч, ДД); Сч = Сч + 1; ЧтениеЧасти.Закрыть(); Поток.Закрыть(); КонецЦикла; Для Каждого ДД Из СтруктураРаспознанногоСообщения Цикл ДД.Значение.Записать("E:\Путь к файлу\" + ДД.Ключ); КонецЦикла; КонецФункции | |||
| 10
    
        Никулин Леонид 27.06.24✎ 16:20 | 
        (8) информативно. Я вообще не так делаю. Ща попробую...     | |||
| 11
    
        Никулин Леонид 27.06.24✎ 16:42 | 
        (8) У меня в теле запроса JSON и картинка. Это добро разделено Разделителем. Вот тело запроса если сделать ПолучитьТелоКакСтроку():
 ----------------------------959821427642407330468393 Content-Disposition: form-data; name="improvementRequest" Content-Type: application/json { "improvementRequest": { "author": { "phoneNumber": "+79991569033", "telegramId": 562306003, "firstName": "Иван", "lastName": "Иванов", "middleName": "Иванович" }, "organisation": "ТК «СОЛНЕЧНЫЙ ДАР»", "ideaVector": "Безопасность", "problem": "В теплицах не носят каски", "idea": "Контролировать ношение касок", "appearanceOfEconomicEffect": "true" } } ----------------------------959821427642407330468393 Content-Disposition: form-data; name="files"; filename="У.jpg"; filename*=UTF-8''%D0%A3.jpg Content-Type: image/jpeg ���� JFIF H H �� C !"$"$�� �J�*Fs�*UV#�Q�a����Í����^�!�!|�N�ҞUc�=}9�Rc��N�i (вот тут кусок текста выкинул т.к. сильно длинный файл) ��JI�K�|��&1�u��|� j���R�s�V� �� ----------------------------959821427642407330468393-- И я если тело переведу в строку потом ЧтениемJSON это дело не прочитаю. Как я понимаю (и как на ИТСе и в подобных примерах сделано) нужно получать тело именно как двоичные данные. И потом читать | |||
| 12
    
        Никулин Леонид 27.06.24✎ 16:44 | 
        В постмене тело оформлено вот так     
 | |||
| 13
    
        Никулин Леонид 27.06.24✎ 17:08 | 
        up.
 (8) Дело в том, что при отправке запроса именно из постмена тело формируется не в том виде как указано в статье. В том всё и дело | |||
| 14
    
        Никулин Леонид 27.06.24✎ 17:41 | 
        up     | |||
| 15
    
        Garikk 27.06.24✎ 17:52 | 
        попробуй покопать в сторону поля Content-Disposition, там много чего бывает разного
 и form-data и attachment и у всего пакета общего может быть mixed а не form-data на этом бывают парсеры спотыкаются у разных сервисов | |||
| 16
    
        novichok79 27.06.24✎ 20:56 | 
        (11) у тебя мультипарт вообще, судя по телу запроса.
 надо вычитать разные части, и взять ту, что у тебя JSON. | |||
| 17
    
        Никулин Леонид 28.06.24✎ 08:12 | 
        (16) Да мультипарт. Он тоже читается как двоичные данные и  разбивается Разделителем на части на сколько я понял. А можно чуть подробнее описать текстом как это делается? Или примерчик с кодом. Буду премного благодарен     | |||
| 18
    
        rozer76 28.06.24✎ 11:54 | 
        (17) может https://infostart.ru/1c/articles/709325/     | |||
| 19
    
        Никулин Леонид 28.06.24✎ 12:50 | 
        Спасибо за комментарий! Посмотрел ссылочку. Нам можно подсмотреть примеры как формировать и передавать запросы. А мне нужно на стороне сервиса получать и читать. Боюсь не мой случай.     | |||
| 20
    
        Никулин Леонид 01.07.24✎ 18:56 | 
        Пишу ответ сам себе. Сто пудов кому-то пригодиться. В моём случае кодировать/расколировать строку в base64 не нужно. Постмен это не делает. И на стороне сервиса при чтении это тоже не нужно. Ошибка как всегда оказалась крайне банальна. В примере из ИТСа (ссылка в первом сообщении) и других примерах разделитель формируется из строки по формату: "==" + Разделитель. В моём случае Постмен с какого-то перепуга формировал разделитель в формате: "--" + Разделитель. В результате двоичные данные не удавалось разбить по корявому разделителю на блоки. Решение. Для совместимости добавил в массив разделителей новые разделители. На всякий случай добавляю получившийся код. При необходимости конечно нужно адаптировать под свою задачу. Еще раз. Это на стороне http-сервиса при чтении полученного запроса:     | |||
| 21
    
        Никулин Леонид 01.07.24✎ 18:59 | 
        Функция ПрочитатьСообщение4(тело, Разделитель)
 //Тело - двоичные данные //Разделитель - Строковый разделитель Маркеры = Новый Массив(); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель)); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель + Символы.ПС)); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель + Символы.ВК)); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель + Символы.ВК + Символы.ПС)); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("==" + Разделитель + "==")); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("--" + Разделитель)); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("--" + Разделитель + Символы.ПС)); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("--" + Разделитель + Символы.ВК)); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("--" + Разделитель + Символы.ВК + Символы.ПС)); Маркеры.Добавить(ПолучитьБуферДвоичныхДанныхИзСтроки("--" + Разделитель + "--")); ТаблицаФайлов = Новый ТаблицаЗначений; ТаблицаФайлов.Колонки.Добавить("ДвоичныеДанные"); ТаблицаФайлов.Колонки.Добавить("ИмяФайла"); ТаблицаФайлов.Колонки.Добавить("Расширение"); ЧтениеДанных = Новый ЧтениеДанных(тело); ЧтениеДанных.ПропуститьДо(Маркеры); ОбщийБуферДвоичныхДанных = ЧтениеДанных.ПрочитатьВБуферДвоичныхДанных(); БуферыДвоичныхДанных = ОбщийБуферДвоичныхДанных.Разделить(Маркеры); Для Каждого Буфер Из БуферыДвоичныхДанных Цикл Поток = новый ПотокВПамяти(Буфер); ЧтениеЧасти = Новый ЧтениеДанных(Поток); ЗаголовкиЧасти = ПрочитатьЗаголовки(ЧтениеЧасти); СтруктураСообщения = ПолучитьСтруктуруСообщения(ЗаголовкиЧасти); Если СтруктураСообщения.name = "improvementRequest" Тогда JSON = чтениеЧасти.ПрочитатьСимволы(); Структура = УправлениеКонтактнойИнформациейСлужебный.СтрокуJSONВСтруктуру(JSON); Иначе Если СтруктураСообщения.name = Неопределено И СтруктураСообщения.filename = Неопределено Тогда Продолжить; КонецЕсли; НовыйФайл = ТаблицаФайлов.Добавить(); НовыйФайл.ДвоичныеДанные = ЧтениеЧасти.Прочитать().ПолучитьДвоичныеДанные(); НовыйФайл.ИмяФайла = СтруктураСообщения.name; МассивПодстрок = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(СтруктураСообщения.filename, "."); КоличествоПодстрок = МассивПодстрок.Количество(); НовыйФайл.Расширение = МассивПодстрок[КоличествоПодстрок-1]; КонецЕсли; ЧтениеЧасти.Закрыть(); Поток.Закрыть(); КонецЦикла; Возврат Новый Структура("Структура,ТаблицаФайлов", Структура, ТаблицаФайлов); КонецФункции Функция ПрочитатьЗаголовки(ЧтениеЧасти) Заголовки = Новый Соответствие(); Пока Истина Цикл Стр = ЧтениеЧасти.ПрочитатьСтроку(); Если Стр = "" Тогда Прервать; КонецЕсли; Части = СтрРазделить(Стр, ":"); ИмяЗаголовка = СокрЛП(Части[0]); Значение = СокрЛП(Части[1]); Заголовки.Вставить(ИмяЗаголовка, Значение); КонецЦикла; Возврат Заголовки; КонецФункции Функция ПолучитьСтруктуруСообщения(Заголовки) Структура = Новый Структура("name,filename"); Описание = Заголовки.Получить("Content-Disposition"); Свойства = СтрРазделить(Описание, ";", Ложь); Для Каждого Свойство Из Свойства Цикл Части = СтрРазделить(Свойство, "=", Ложь); ИмяСвойства = СокрЛП(Части[0]); Если ИмяСвойства = "name" Тогда Структура.name = СтрЗаменить(СокрЛП(Части[1]), """", ""); КонецЕсли; Если ИмяСвойства = "filename" Тогда Структура.filename = СтрЗаменить(СокрЛП(Части[1]), """", ""); КонецЕсли; КонецЦикла; Возврат Структура; КонецФункции | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |