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