Относительное мыло WSDL: расположение адреса - PullRequest
16 голосов
/ 11 августа 2011

Могу ли я иметь адрес soap: address в WSDL относительно расположения WSDL или, по крайней мере, относительно сервера? Например, я хочу написать:

<soap:address location="https://exampleserver.com/axis2/services/ExampleService" />

как:

<soap:address location="/axis2/services/ExampleService" />

Это позволит ускорить развертывание на нескольких серверах, например на тестовых серверах. Кроме того, в случае axis2c, если я хочу, чтобы мой сервис использовался как по HTTP, так и по HTTPS, жизнь разработчиков, использующих мой сервис, усложняется, поскольку они не могут просто импортировать WSDL из его расположения по умолчанию "? WSDL".

Ответы [ 3 ]

7 голосов
/ 02 сентября 2011

WSDL описывает клиентам форматы, типы, параметры и т. Д., Необходимые для взаимодействия с веб-службой. Затем он используется такими инструментами, как WSDL2C , для генерации кода, необходимого для взаимодействия.

Но даже если вы выставите свой сервис по HTTP или HTTPS, код заглушки клиента будет таким же. Вы не регенерируете свои клиентские заглушки для каждого адреса конечной точки . Клиент остается прежним, меняется точка доступа.

Этот адрес не должен быть жестко закодирован в сгенерированном клиентском коде, это должен быть настраиваемый URL-адрес внутри клиентского приложения.

Конечно, у вас есть URL-адрес, указанный в WSDL, и это создает неудобства при развертывании веб-службы на сервере разработки, а затем в стадии подготовки и последующего запуска в производство. Конечные точки будут разными в каждой среде (может быть умножено на 2 для HTTP + HTTPS), но на этом этапе ваши разработчики не будут затронуты, потому что вы не обновите код.

Когда дело доходит до доступа к веб-службе, у вас все равно будут разные адреса (для серверов dev, staging и prod), даже если они будут относительными или абсолютными. Поэтому я не понимаю, как полезно иметь относительный адрес внутри WSDL, поскольку вам все еще нужно управлять точками доступа в конфигурации клиента.

4 голосов
/ 25 июля 2013

Есть два способа получения WSDL.

Один, где подается жестко закодированный wsdl, например:

https://hostname/contextname/services/myAPIService/myAPI.wsdl

, и другой, где подается сгенерированный wsdl,например:

https://hostname/contextname/services/myAPIService?wsdl

Если вы используете динамический параметр, он будет использовать этот код:

req.getRequestURL().toString();

, чтобы получить URL, который будет использоваться в сгенерированном WSDL.Этот код находится в классе ListingAgent (в пакете org.apache.axis2.transport.http).

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

Одна проблема, которую я обнаружил с динамическими параметрами, заключается в том, что если в исходном WSDL-местоположении используется HTTP, то в сгенерированном он все равно будетиспользуйте HTTP, даже если вы использовали HTTPS для доступа к нему.(Это происходит в версии 1.5, которая используется моим проектом)

Другая проблема заключается в том, что вы используете балансировщик нагрузки, потому что сгенерированный WSDL будет создан с расположением конечного сервера вместо балансировщика,Для этого можно расширить классы AxisServlet и ListingAgent, чтобы заменить код, упомянутый выше.

3 голосов
/ 10 января 2012

После долгого поиска я почти уверен, что атрибут soap:address location должен быть абсолютным URL.Это усложняет ситуацию, если вы работаете с различными средами, такими как разработка, тестирование и производство.

Возможно, в качестве обходного пути можно было бы прочитать на стороне клиента первую часть URL из файла конфигурациинапример, https://exampleserver.com) и последняя часть из WSDL (например, /axis2/services/ExampleService) и объединить их, чтобы построить абсолютный путь.Первый позволит вам переключаться между средами.

...