Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 8 общая

парсинг form-data body http-запроса ?

парсинг form-data body http-запроса ?
Я
   Noxvil
 
01.06.19 - 19:52
Добрый день.
Создал httpсервис.

Передаю на него через body 2 параметра в формате form-data
Получаю строку:

----------------------------860489963022007158480667
Content-Disposition: form-data; name="username"

ff
----------------------------860489963022007158480667
Content-Disposition: form-data; name="password"

ddd
----------------------------860489963022007158480667--

Как правильно распарсить тело в структуру?
 
 
   Garykom
 
1 - 01.06.19 - 20:03
Разделитель = "----------------------------860489963022007158480667";
Для начала

Затем ищи "Content-Disposition: form-data; name=" правее будет имя параметра, а строкой ниже значение.
   Garykom
 
2 - 01.06.19 - 20:04
Вот тут файлы выцепляют сделай по аналогии http://catalog.mista.ru/public/870107/
   Noxvil
 
3 - 01.06.19 - 21:13
Я так понимаю - типового метода нет?
   Garykom
 
4 - 01.06.19 - 22:00
(3) Напиши сам, выложи на ИС и заработай копеечку
   Юрий Лазаренко
 
5 - 02.06.19 - 04:02
   Garykom
 
6 - 02.06.19 - 15:16
(5) Так не за что благодарить, у ТС не в составных сообщениях проблема а обычном парсинге одной уже строки чего там нет пока.
   Юрий Лазаренко
 
7 - 03.06.19 - 11:01
(6) Там же практически все расписано. Надо только полученные ключи-значения в структуру положить.
   Noxvil
 
8 - 03.06.19 - 19:56
(5) Всё же... Я благодарю. Сэкономил кучу времени.

В примере, правда, к разделителю добавляется "==", а у меня в postman ставятся "--".
Выкладываю допиленный код, который решает мою проблему.

// Процедура - Получить структуру параметров

//
// Параметры:

//  Заголовки          - Соответствие   - Заголовки запроса.
//  ДвоичныеДанныеТело - ДвоичныеДанные - Тело запроса.

//
Функция ПолучитьСтруктуруПараметров(Заголовки, ДвоичныеДанныеТело) Экспорт
    
    Разделитель = ПолучитьРазделительСоставногоСообщения(Заголовки);
    
    Маркеры = Новый Массив();
    Маркеры.Добавить("--" + Разделитель);
    Маркеры.Добавить("--" + Разделитель + Символы.ПС);
    Маркеры.Добавить("--" + Разделитель + Символы.ВК);
    Маркеры.Добавить("--" + Разделитель + Символы.ВК + Символы.ПС);
    Маркеры.Добавить("--" + Разделитель + "--");
    
    СтруктураПараметров = Новый Структура(); 
    
    ЧтениеДанных = Новый ЧтениеДанных(ДвоичныеДанныеТело);
    
    Размер = ДвоичныеДанныеТело.Размер();
    
    // Переходим к началу первой части.

    ЧтениеДанных.ПропуститьДо(Маркеры);
    
    // Далее в цикле читаем все части.

    Пока Истина Цикл
        РезультатЧтенияЧасть = ЧтениеДанных.ПрочитатьДо(Маркеры);
        
        Если Не РезультатЧтенияЧасть.МаркерНайден Тогда
            
            // Неправильно сформированное сообщение.

            Прервать;
            
        КонецЕсли;
        
        ЧтениеЧасти = Новый ЧтениеДанных(РезультатЧтенияЧасть.ОткрытьПотокДляЧтения());
        ЗаголовкиЧасти = ПрочитатьЗаголовки(ЧтениеЧасти);
        ИмяЧасти       = ПолучитьИмяСообщения(ЗаголовкиЧасти);
        ИмяФайла       = ПолучитьИмяФайла(ЗаголовкиЧасти);
        
        Если ИмяФайла = Неопределено Тогда
        
            СтруктураПараметров.Вставить(ИмяЧасти,ЧтениеЧасти.ПрочитатьСимволы());
            
        Иначе
            
            Если НЕ СтруктураПараметров.Свойство(ИмяЧасти) Тогда            
                СтруктураПараметров.Вставить(ИмяЧасти,Новый Массив)            
            КонецЕсли;
            
            СтруктураФайла = Новый Структура();
            СтруктураФайла.Вставить("ИмяФайла",ИмяФайла);
            СтруктураФайла.Вставить("ДвоичныеДанные",ЧтениеЧасти.Прочитать().ПолучитьДвоичныеДанные());
            
            СтруктураПараметров[ИмяЧасти].Добавить(СтруктураФайла);
            
        КонецЕсли; 
                
        Если РезультатЧтенияЧасть.ИндексМаркера = 4 Тогда
            
            // Прочитали последнюю часть.

            Прервать;
            
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат СтруктураПараметров;
    
КонецФункции

// Функция - Прочитать заголовки

//
// Параметры:

//  ЧтениеЧасти     - ЧтениеДанных - Часть запроса.
// 

// Возвращаемое значение:
//  Соответствие - Заголовки части.

//
Функция ПрочитатьЗаголовки(ЧтениеЧасти)
    
    Заголовки = Новый Соответствие();
    
    Пока Истина Цикл
        Стр = ЧтениеЧасти.ПрочитатьСтроку();
        
        Если Стр = "" Тогда
            
            Прервать;
            
        КонецЕсли;
        
        Части = СтрРазделить(Стр, ":");
        ИмяЗаголовка = СокрЛП(Части[0]);
        Значение     = СокрЛП(Части[1]);
        
        Заголовки.Вставить(ИмяЗаголовка, Значение);
        
    КонецЦикла;
    
    Возврат Заголовки;
    
КонецФункции

// Функция - Получить разделитель составного сообщения

//
// Параметры:

//  Заголовки     - Соответствие - Заголовки запроса.
// 

// Возвращаемое значение:
//  Строка - Разделитель составного сообщения

//
Функция ПолучитьРазделительСоставногоСообщения(Заголовки)
    ТипСодержимого = Заголовки.Получить("Content-Type");
    
    Свойства = СтрРазделить(ТипСодержимого, ";", Ложь);
    Граница = Неопределено;
    
    Для Каждого Свойство Из Свойства Цикл
        Части = СтрРазделить(Свойство, "=", Ложь);
        ИмяСвойства = СокрЛП(Части[0]);
        
        Если ИмяСвойства <> "boundary" Тогда
            
            Продолжить;
            
        КонецЕсли;
        
        Граница = СокрЛП(Части[1]);
        
        Прервать;
        
    КонецЦикла;
        
    Возврат Граница;
    
КонецФункции

// Функция - Получить имя сообщения

//
// Параметры:

//  Заголовки     - Соответствие - Заголовки части.
// 

// Возвращаемое значение:
//  Строка - Имя сообщения.

//
Функция ПолучитьИмяСообщения(Заголовки)

    Описание = заголовки.Получить("Content-Disposition");
    
    Свойства = СтрРазделить(Описание, ";", Ложь);
    Имя = Неопределено;
    
    Для Каждого Свойство Из Свойства Цикл
        Части = СтрРазделить(Свойство, "=", Ложь);
        ИмяСвойства = СокрЛП(Части[0]);
        
        Если ИмяСвойства <> "name" Тогда
            
            Продолжить;
            
        КонецЕсли;
        
        Имя = СокрЛП(Части[1]);
        Имя = СтрЗаменить(Имя,"""","");
        
        Прервать;
        
    КонецЦикла;
        
    Возврат Имя;
    
КонецФункции

Функция ПолучитьИмяФайла(Заголовки)

    Описание = заголовки.Получить("Content-Disposition");
    
    Свойства = СтрРазделить(Описание, ";", Ложь);
    Имя = Неопределено;
    
    Для Каждого Свойство Из Свойства Цикл
        Части = СтрРазделить(Свойство, "=", Ложь);
        ИмяСвойства = СокрЛП(Части[0]);
        
        Если ИмяСвойства <> "filename" Тогда
            
            Продолжить;
            
        КонецЕсли;
        
        Имя = СокрЛП(Части[1]);
        Имя = СтрЗаменить(Имя,"""","");
        
        Прервать;
        
    КонецЦикла;
        
    Возврат Имя;
    
КонецФункции
   Garykom
 
9 - 03.06.19 - 20:01
Слишком сложный и ненужный код для твоей конкретной задачи
   Volodja
 
10 - 03.06.19 - 21:19
Если полученная строка многострочная тогда:


UserName=СтрПолучитьСтроку(_ПолученнаяСтрока, 4);
Пароль=СтрПолучитьСтроку(_ПолученнаяСтрока, 8);
   Юрий Лазаренко
 
11 - 03.06.19 - 21:24
(8) Всегда пожалуйста

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