2016-05-04 13 views
0

Мне нужно решение для решения этой проблемы:Преобразование внешнего формата во внутренний формат

Я поставщик услуг, и есть несколько клиентов службы, с которыми я работаю. каждый клиент службы посылает мне запрос на своем собственном формате, например:

service client 1 fields are --> f1 , f2 , f3 
service client 2 fields are --> f2 , f3 , f4 
service client 3 fields are --> f3 , f7 , f8 

можно их добавлять или удалять новые поля или изменить свой текущий формат, например «служба клиент 1» включает в себя:

f1+f2 ==> f12 and adds f5 

или клиент 3:

decomposes f7 ---> f1,f2 

Мне нужен внутренний формат для себя, например:

f1,f2,f3,f4,f5,f6,f7,f8,f9 

Этот формат должен быть сконфигурирован таким образом, что я могу изменить его с помощью файла конфигурации xml, поэтому, когда изменение происходит на стороне клиента, я исправляю его, изменяя xml без изменения исходного кода.

Как я могу это сделать?

ответ

0

Вкратце, вам нужен API, с помощью которого вы можете передать свое внешнее сообщение, а также файл «как», и он делает некоторые магии на нем и доставляет вам внутреннее сообщение. Давайте сосредоточимся на основной обязанности API, который является преобразованием сообщений. Как вы упомянули, он должен быть настроен с помощью файла конфигурации XML. Нам нужен элемент, который можно назвать «Поле», в котором есть хотя бы один атрибут, который я называю «имя». Я обертываю коллекцию этих элементов Field внутри родительского элемента. Каждое из элементов «Поле» обозначает поле в целевом внутреннем сообщении. В элементе Field я хотел бы добавить еще один элемент, который отвечает за сбор моих желаемых полей и выполняет на них функцию. Вот пример из XML-конфигурации:

<fields> 
    <field name="aLong"> 
     <function name="add"> 
      <arg> 
       <function name="readExternalField"> 
        <arg> 
         f1 
        </arg> 
       </function> 
      </arg> 
      <arg> 
       <function name="readExternalField"> 
        <arg> 
         f2 
        </arg> 
       </function> 
      </arg> 
     </function> 
    </field> 
    <field name="aStr"> 
     <function name="getFromArray" index="0"> 
      <arg> 
       <function name="splitStr" character=" "> 
        <arg> 
         <function name="readExternalField"> 
          <arg> 
           f3 
          </arg> 
         </function> 
        </arg> 
       </function> 
      <arg> 
     </function> 
    </field> 
</fields> 

Представьте, что есть внутренний объект, который имеет по крайней мере два поля под названием «ВМЕСТЕ» и «астрономический» и внешний объект, который имеет по крайней мере три поля: «f1», «F2» и «f3». Дело в том, что я должен убедиться в том, что вы используете функции, которые их возвращаемые типы назначаются целевым полям. Функция «добавить» добавляет значение полей «f1» и «f2», и результат должен быть присвоен полю «aLong», а функция splitStr разделяет поле «f3» и возвращает массив, который выполняет функция getFromArray "Получает в результате первый элемент массива.
Я предпочитаю использовать JAXB API для демонтажа моего XML-файла и его легко разбирать, поэтому нам нужен XSD-документ, который можно создать из файла XML через онлайн-инструменты. Я предлагаю использовать объекты на основе карты, чтобы избавиться от необходимости делать вещи отражения. Если вы создаете службы REST, принятое сообщение JSON может быть преобразовано в объект карты. Таким образом, ваш API имеет метод, который получает объект на основе карты и возвращает то же самое. Таким образом, каждое поле является ключом на карте, а не полем в классе. Но функции могут иметь определенные параметры с определенными типами. Основная часть API должна передать полученные объекты из внешней карты перед передачей их функциям и поместить возвращаемое значение во внутреннее сообщение с указанным именем поля в файле XML.
Я надеюсь, что этот краткий ответ освещает путь к удовлетворительному решению и помнит, что создание эффективного API, с которым вы можете поделиться с коллегами с гордостью, - это умение, и только практика дает вам это.

+0

Благодарим вас за то, что нашли время, чтобы поделиться со мной всей этой замечательной информацией. ваше решение достаточно всеобъемлющее и полностью то, что мне нужно. – mhsaeedi

+0

приветствую :) –

Смежные вопросы