Недавно я работал над клиентом, который вызывает веб-сервис. Я делал это раньше и думал, что это легко. Однако некоторые проблемы, с которыми я столкнулся в процессе, заставили меня осознать, что я еще слишком мало знаю.
Серверная часть веб-службы требует проверки подлинности сертификата. Сертификат был отправлен мне в формате cer. После использования инструмента Java keytool для извлечения сертификата выполните следующую инструкцию при вызове веб-службы:
System.setProperty("javax.net.ssl.trustStore", "xxxx.truststore");
Сообщите серверу, что у моего клиента есть сертификат и пока проблем нет.
Затем я использовал wsdl2java от axis2 для генерации клиентского кода, но сразу же после его выполнения произошла следующая ошибка:
org.apache.axis2.AxisFault: [ISS.0088.9125] Запрос SOAP не соответствует модели сообщений SOAP.
Эта ошибка была обнаружена в документе разработки SOAP, поскольку запрошенный формат сообщения SOAP неверен. Адрес документа: http://documentation.softwareag.com/webmethods/wmsuite7/Developer/Guides/7-1-1_SOAP_Developers_Guide.pdf (89). Страница)
В это время другая сторона попросила меня отправить сообщение с запросом на мыло. Я был только на этапе использования веб-сервиса и мог использовать такие инструменты, как ось и xfire, для написания сервера и клиента, но я лишь немного знал о мыле. Я поискал информацию в Интернете и спросил Коллегу, после долгих усилий я наконец нашел сообщение с запросом. Метод, предложенный коллегами, заключается в использовании таких инструментов, как tcp-монитор, но веб-сервис имеет формат https и не может быть использован. Позже я набрал SOAPEnvelope.toString() в сгенерированном клиентском коде, чтобы получить его следующим образом:
<?xml version='1.0'coding='utf-8'?>
<soapenv:Envelope xmlns:soapenv=" http://schemas.xmlsoap.org/soap/envelope/ ">
<soapenv:Тело>
<ns1:UPLGenerate xmlns:ns1=" http://www.alcatel-lucent.com/webService/WS_UPL ">
<OperationCode>1 </OperationCode>
<Растение>2 </Растение>
<QuoteNumber>3 </QuoteNumber>
<UserID>4 </UserID>
<IncludePriceType>5 </IncludePriceType>
</ns1:UPLGenerate>
</soapenv:Body>
</soapenv:Конверт>
Фактически, причина этой проблемы заключается в том, что кодировка передачи по умолчанию для клиента axis2 разбита на части, поэтому в начале и конце тела сообщения запроса мыла будет два числа. Вы можете использовать tcpmon для его проверки. .net или некоторые другие серверы не поддерживают этот режим. Да, просто установите его в коде следующим образом:
stub._getServiceClient().getOptions().setProperty(HTTPConstants.CHUNKED, false);
Я исследовал это на выходных, посоветовался со старшим сотрудником компании и дал мне несколько советов. Большое ему спасибо!
Я думал, что теперь с исполнением проблем быть не должно, но есть и другая проблема.
Исключение в потоке «основной» org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: неожиданный подэлемент xxxxResponse
в org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
Эта проблема беспокоит меня уже три дня. Я много чего нашел в Интернете. Некоторые говорили, что нужно использовать wstx-asl-3.2.1.jar и т. д., но я попробовал их все, и это не сработало. По крайней мере, это не помогло. не из-за этой ошибки с моей стороны. Мне очень срочно. Я понятия не имел. Позже я случайно распечатал org.apache.axiom.soap.SOAPEnvelope _returnEnv в заглушке, которая есть _returnEnv.toString(). Я обнаружил, что результат, возвращаемый SoapUI, был другим, потому что веб-сервис был https, поэтому его нельзя было использовать. Теперь я понимаю, что следующие элементы в возвращаемом ответе не всегда присутствуют, но они не определены. в определении wsdl, то есть minOccurs="0" не пишется. В результате, если клиентский код, сгенерированный этим wsdl, не извлекается. Если вы обнаружите те элементы, которые не возвращаются, естественно будет сообщено об ошибке. Добавить. minOccurs="0" в wsdl, повторно создайте клиентский код, протестируйте и передайте его.
На последнем этапе после развертывания в веб-сфере при выполнении вызова веб-сервиса произошла ошибка:
java.net.SocketException: неподключенные сокеты не реализованы
Это была проблема с сертификатом. Это заняло несколько дней, а затем повторилось. Это произошло потому, что родительский сертификат этого сертификата отсутствовал. Короче говоря, если вы не можете получить все сертификаты через хост и порт в веб-сфере, включая используемые сертификаты. непосредственно в центр сертификации. Для сертификатов единственный способ — импортировать файл .cer. Корень проблемы здесь: сертификат! ! !
Проблемы, с которыми я столкнулся, были раздражающими, но вознаграждение было немалым. Всего за несколько дней я углубил свое понимание веб-сервиса. Мне стыдно признаться, что раньше я знал, как использовать Axis только для написания сервера. а затем используйте wsdl для создания клиента. Я не знаю, можно ли использовать wsdl для создания серверной части. К счастью, благодаря этой возможности я добился прогресса, и каждый может меня подбодрить.
-