최근에 웹 서비스를 호출하는 클라이언트 작업을 하고 있었는데 이전에 해본 적이 있어서 쉽다고 생각했습니다. 그러나 그 과정에서 직면한 몇 가지 문제로 인해 아직 제가 아는 것이 너무 적다는 것을 깨달았습니다.
웹 서비스의 서버 측에서는 인증서 인증이 필요합니다. 인증서는 Java keytool 도구를 사용하여 인증서를 추출한 후 웹 서비스를 호출할 때 다음 명령문을 실행합니다.
System.setProperty("javax.net.ssl.trustStore", "xxxx.truststore");
내 클라이언트에 인증서가 있고 지금까지는 문제가 없다고 서버에 알립니다.
다음으로 axis2의 wsdl2java를 사용하여 클라이언트 코드를 생성했지만 실행되자마자 다음 오류가 발생했습니다.
org.apache.axis2.AxisFault: [ISS.0088.9125] SOAP 요청이 SOAP 메시지 모델을 따르지 않습니다.
이 오류는 요청한 비누 메시지 형식이 잘못되어 비누 개발 문서에서 발견되었습니다. 문서 주소는 http://documentation.softwareag.com/webmethods/wmsuite7/Developer/Guides/7-1-1_SOAP_Developers_Guide.pdf (89)입니다. 페이지)
이때 상대방이 나에게 비누 요청 메시지를 보내달라고 요청했는데, 나는 아직 웹서비스를 사용하는 단계에 불과하여 서버와 클라이언트를 작성하기 위해 axis, xfire 등의 도구를 사용할 수 있었지만 비누에 대해서는 조금밖에 알지 못했다. 인터넷에서 정보를 찾아 동료에게 물어보니, 오랜 시간 고민 끝에 드디어 요청 메시지를 발견했습니다. 동료들이 알려주는 방법은 tcp monitor 등의 도구를 사용하는 방법인데, 웹서비스가 https 형식이어서 사용할 수 없습니다. 나중에 생성된 클라이언트 코드에 SOAPEnvelope.toString()을 입력하여 가져왔습니다.
<?xml 버전='1.0' 인코딩='utf-8'?>
<soapenv:봉투 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 </플랜트>
<인용번호>3 </인용번호>
<사용자ID>4 </사용자ID>
<IncludePriceType>5 </IncludePriceType>
</ns1:UPL생성>
</soopenv:바디>
</soopenv:봉투>
실제로 이 문제가 발생하는 이유는 axis2 클라이언트의 기본 전송 인코딩이 청크되어 있으므로 SOAP 요청 메시지 본문의 시작과 끝 부분에 두 개의 숫자가 있기 때문입니다. tcpmon을 사용하여 테스트할 수 있습니다. .net 또는 일부 다른 서버는 이 모드를 지원하지 않습니다. 예, 다음과 같이 코드에서 설정하면 됩니다.
stub._getServiceClient().getOptions().setProperty(HTTPConstants.CHUNKED, false);
주말에 조사해서 회사 선배한테 상담받고 몇 가지 제안도 해줬어요.
이제 실행에는 문제가 없을 거라 생각했는데, 또 다른 문제가 있습니다.
스레드 "main" org.apache.axis2.AxisFault의 예외: org.apache.axis2.databound.ADBException: 예기치 않은 하위 요소 xxxxResponse
org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)에서
이 문제는 3일 동안 나를 괴롭혔습니다. 어떤 사람들은 wstx-asl-3.2.1.jar 등을 사용한다고 말했지만 모두 시도했지만 적어도 작동하지 않았습니다. 내 쪽의 오류 때문이 아닙니다. 나는 단서가 없었습니다. 나중에 실수로 _returnEnv.toString()에 있는 org.apache.axiom.soap.SOAPEnvelope _returnEnv를 인쇄했습니다. .soapUI에서 반환한 결과가 웹 서비스가 https이기 때문에 사용할 수 없다는 것을 알았습니다. tcpmon을 사용하면 반환된 응답에 다음 요소가 항상 존재하는 것은 아니지만 정의되어 있지 않기 때문에 이제 이해됩니다. wsdl 정의에는 minOccurs="0"이 기록되지 않습니다. 결과적으로 이 wsdl에 의해 생성된 클라이언트 코드를 가져오지 못하는 경우 반환되지 않는 요소를 찾으면 자연스럽게 오류가 보고됩니다. wsdl에 minOccurs="0"을 지정하고 클라이언트 코드를 다시 생성한 후 테스트하고 통과합니다.
마지막 단계에서 websphere에 배포한 후 webservice 호출을 실행할 때 오류가 발생했습니다.
java.net.SocketException: 연결되지 않은 소켓이 구현되지 않았습니다.
인증서 문제였는데, 며칠이 걸렸는데, 이 인증서의 상위 인증서가 누락되었기 때문이었습니다. 간단히 말해서, 사용된 인증서를 포함하여 websphere의 호스트 및 포트를 통해 모든 인증서를 얻을 수 없는 경우입니다. 인증서의 경우 유일한 방법은 .cer 파일을 가져오는 것입니다. 문제의 원인은 바로 인증서입니다. ! !
제가 겪은 문제들은 귀찮았지만 보상은 작지 않았습니다. 부끄럽게도 예전에는 서버를 작성하는 방법만 알았고, 웹 서비스에 대한 이해가 단 며칠 만에 깊어졌습니다. 그런 다음 wsdl을 사용하여 클라이언트를 생성합니다. wsdl을 사용하여 서버 측을 생성할 수 있는지는 알 수 없습니다. 다행히도 이번 기회를 통해 나는 진전을 이루었고 모두가 나를 격려해 줄 수 있습니다.
-