Рубрики
Без рубрики

Потребляя мыльный веб-сервис в Jython.

Несколько месяцев назад я был помещен на проект, который требовал автоматизированного процесса для связи с … Tagged с Python, Jython, Soap.

Несколько месяцев назад я был помещен на проект, который требовал автоматизированного процесса для связи с API. Автоматизация была сделана в Jython, внедрение Python на JVM, который позволяет динамически компиляцию объектов Java. В основном, если вы хотите использовать язык сценариев, упакованный с библиотекой инструментов, вы должны рассмотреть Jython.

Я прошел несколько подходов, прежде чем я приземлился на этом, мой первый подход должен был потреблять его с помощью библиотек Python, но брандмауэр предотвратил любые устанавливаемые PIP. Вы можете попробовать вручную установить все зависимости, но вместо этого не смотрим на краской. Вокруг брандмауэра есть способ, но он работает только, если у вас есть прокси, который я не сделал Поэтому мне пришлось найти другой путь.

Второй подход, который я пытался поглотить его прямо в Java и упаковывать его в файл JAR и вызовите его в приложении Jython. Это будет работать, но я бы не рекомендовал это, потому что вы управляете двумя отдельными приложениями. Если что-то сломается, откуда вы знаете, где ваша проблема? Это Jython или Java? Вам придется получить первоначальный исходный код, измените его, переупакуйте его и повторное повторное тестирование. Этот подход не легко поддерживаться, особенно если вы уходите. Весь новый разработчик имеет файл JAR и отладку становится болезненным.

Есть более простой способ решить это. Jython уже позволяет Java библиотеки. Использование библиотеки Java с синтаксисом Jython – это гораздо простой способ сделать это. Я решил пойти с API Saaj, и вот как я это сделал.

Я создал услугу, которая возвращает даты выпуска альбома Beyonce, учитывая имя альбома (да Я огромный поклонник).

Первый шаг – построить сообщение SOAP, которое вы отправляете. Я сделал это немного отличается от документации. Я добавил конверт SOAP в файл XML, я замещал параметр (то есть имя альбома) с переменной, которая будет сопоставлена в код.






${albumName}


Отображение переменных относительно легко, используя метод StrsubStutor из библиотеки Apache Commons. Посмотрите на код ниже, который отображает переменную:

def mapVariableToRequestFile(albumName):
  mapping = HashMap()
  mapping.put("albumName",albumName)
  xmlFile = File(pathToXmlRequest)
  fileStream = FileInputStream(xmlFile)
  template = IOUtils.toString(fileStream,"UTF-8")
  sub = StrSubstitutor(mapping)
  request = sub.replace(template)
  return request

Следующим шагом является создание фактического сообщения, которое будет отправлено. Библиотека создает сообщение из байтов запроса, мы можем легко получить байты из нашей запроса, возвращенной из MapVariaBletoreQuestFile. Иногда требуется явное отливка, тип того, что Jython возвращается, может не обязательно быть тем, который вам нужен. Чтобы использовать метод GetBytes () класса String, мне пришлось лишить запрос на строку, потому что она возвращала объект Unicode.

def createSOAPMessage(request):
  messageFactory = MessageFactory.newInstance()
  stream = ByteArrayInputStream(String(request).getBytes())
  soapMessage = messageFactory.createMessage(None,stream)
  soapMessage.saveChanges()
  return soapMessage

Последний шаг – отправить фактическое сообщение. Я не использовал аутентификацию в моем примере (не требуется сертификат) и поэтому использовал метод подключения библиотеки.

def sendSoapRequest():
  request = mapVariableToRequestFile("Lemonade")
  soapMessage = createSOAPMessage(request)
  soapConnectionFactory = SOAPConnectionFactory.newInstance()
  soapConnection = soapConnectionFactory.createConnection()
  soapResponse = soapConnection.call(soapMessage,soapEndpointUrl)

Вы можете легко увидеть ответ, написав в System.Out и печатать его следующим образом.

soapResponse.writeTo(System.out)
System.out.println()

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

Нахождение решения для моей проблемы было для меня целый кошмар, вот надеяться, что это устраняет, что для кого-то другого.

Оригинал: “https://dev.to/angelamchunu/consuming-a-soap-web-service-in-jython-2lp9”