Имя: Пароль:
1C
1С v8
парсинг form-data body http-запроса ?
0 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--

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

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


UserName=СтрПолучитьСтроку(_ПолученнаяСтрока, 4);
Пароль=СтрПолучитьСтроку(_ПолученнаяСтрока, 8);
11 Юрий Лазаренко
 
03.06.19
21:24
(8) Всегда пожалуйста
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.