2013-01-16 7 views
0

나는이 WSDL을 제공 받았고, 클라이언트를 개발해야한다. (나는 그것에 대해 질문을하고있다.) 웹 서비스 클라이언트에서 사용자 이름과 암호를 설정할 위치는 어디입니까?

<?xml version="1.0" encoding="UTF-8"?> 
<wsdl:definitions targetNamespace="urn:ManterFornecedor" xmlns:s0="urn:ManterFornecedor" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <wsdl:types> 
    <xsd:schema elementFormDefault="qualified" targetNamespace="urn:ManterFornecedor"> 
     <xsd:element name="Novo" type="s0:InputMapping1"/> 
     <xsd:complexType name="InputMapping1"> 
      <xsd:sequence> 
       <xsd:element name="NO_FORNECEDOR" type="xsd:string"/> 
       <xsd:element name="DE_CONTRATO" type="xsd:string"/> 
       <xsd:element name="DH_INICIO" nillable="true" type="xsd:dateTime"/> 
       <xsd:element name="DH_FIM" nillable="true" type="xsd:dateTime"/> 
       <xsd:element name="NO_PRODUTO" type="xsd:string"/> 
       <xsd:element name="IC_STATUS" type="s0:IC_STATUSType" nillable="true"/> 
      </xsd:sequence> 
     </xsd:complexType> 
     <xsd:simpleType name="IC_STATUSType"> 
      <xsd:restriction base="xsd:string"> 
       <xsd:enumeration value="Ativo"/> 
       <xsd:enumeration value="Inativo"/> 
      </xsd:restriction> 
     </xsd:simpleType> 
     <xsd:element name="NovoResponse" type="s0:OutputMapping1"/> 
     <xsd:complexType name="OutputMapping1"> 
     <xsd:sequence> 
      <xsd:element name="Id" type="xsd:string"/> 
     </xsd:sequence> 
     </xsd:complexType> 
     <xsd:element name="AuthenticationInfo" type="s0:AuthenticationInfo"/> 
     <xsd:complexType name="AuthenticationInfo"> 
     <xsd:sequence> 
      <xsd:element name="userName" type="xsd:string"/> 
      <xsd:element name="password" type="xsd:string"/> 
      <xsd:element minOccurs="0" name="authentication" type="xsd:string"/> 
      <xsd:element minOccurs="0" name="locale" type="xsd:string"/> 
      <xsd:element minOccurs="0" name="timeZone" type="xsd:string"/> 
     </xsd:sequence> 
     </xsd:complexType> 
    </xsd:schema> 
    </wsdl:types> 

    <wsdl:message name="NovoSoapOut"> 
     <wsdl:part element="s0:NovoResponse" name="parameters"></wsdl:part> 
    </wsdl:message> 

    <wsdl:message name="ARAuthenticate"> 
     <wsdl:part element="s0:AuthenticationInfo" name="parameters"></wsdl:part> 
    </wsdl:message> 

    <wsdl:message name="NovoSoapIn"> 
     <wsdl:part element="s0:Novo" name="parameters"></wsdl:part> 
    </wsdl:message> 

    <wsdl:portType name="PortPortType"> 
     <wsdl:operation name="Novo"> 
     <wsdl:input message="s0:NovoSoapIn"></wsdl:input> 
     <wsdl:output message="s0:NovoSoapOut"></wsdl:output> 
     </wsdl:operation> 
    </wsdl:portType> 

    <wsdl:binding name="PortSoapBinding" type="s0:PortPortType"> 
     <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> 
     <wsdl:operation name="Novo"> 
      <soap:operation soapAction="urn:ManterFornecedor/Novo" style="document"/> 
      <wsdl:input> 
       <soap:header message="s0:ARAuthenticate" part="parameters" use="literal"></soap:header> 
       <soap:body use="literal"/> 
      </wsdl:input> 
      <wsdl:output> 
       <soap:body use="literal"/> 
      </wsdl:output> 
     </wsdl:operation> 
    </wsdl:binding> 

    <wsdl:service name="ManterFornecedorService"> 
     <wsdl:documentation>Fornecedor</wsdl:documentation> 
     <wsdl:port binding="s0:PortSoapBinding" name="PortSoap"> 
      <soap:address location="http://somewhere&amp;webService=ManterFornecedor"/> 
     </wsdl:port> 
    </wsdl:service> 

</wsdl:definitions> 

내가 전체 WSDL을 제공하지만, 질문의 중요한 부분

<soap:operation soapAction="urn:ManterFornecedor/Novo" style="document"/> 
    <wsdl:input> 
     <soap:header message="s0:ARAuthenticate" part="parameters" use="literal"></soap:header> 
     <soap:body use="literal"/> 
    </wsdl:input> 

당신이 볼 수 있듯이이며, 입력

<wsdl:message name="ARAuthenticate"> 
    <wsdl:part element="s0:AuthenticationInfo" name="parameters"></wsdl:part> 
</wsdl:message> 

<xsd:element name="AuthenticationInfo" type="s0:AuthenticationInfo"/> 
<xsd:complexType name="AuthenticationInfo"> 
<xsd:sequence> 
    <xsd:element name="userName" type="xsd:string"/> 
    <xsd:element name="password" type="xsd:string"/> 
    <xsd:element minOccurs="0" name="authentication" type="xsd:string"/> 
    <xsd:element minOccurs="0" name="locale" type="xsd:string"/> 
    <xsd:element minOccurs="0" name="timeZone" type="xsd:string"/> 
</xsd:sequence> 
</xsd:complexType> 
자사의 헤더에 ARAuthenticate 메시지가

이 웹 서비스를 테스트하기 위해 Eclipse의 웹 서비스 탐색기를 사용하여 WS 클라이언트를 만들었습니다. 이 클라이언트에는 설정할 사용자 이름과 암호 필드가 있습니다.

이제이 클라이언트 예제 코드를 가져와 정보를 수집하고 클라이언트를 사용하여 서버로 보내는 독립 실행 형 (웹 UI가 아닌) 솔루션을 구현해야합니다. 하지만 그것은 실패한 것이고, 인증 때문이라고 생각합니다. 곳이 캐시 물건에서 오는,

org.apache.axis.client.Call _call = super._createCall(); 
    if (super.maintainSessionSet) { 
     _call.setMaintainSession(super.maintainSession); 
    } 
    if (super.cachedUsername != null) { 
     _call.setUsername(super.cachedUsername); 
    } 
    if (super.cachedPassword != null) { 
     _call.setPassword(super.cachedPassword); 
    } 
    if (super.cachedEndpoint != null) { 
     _call.setTargetEndpointAddress(super.cachedEndpoint); 
    } 
    if (super.cachedTimeout != null) { 
     _call.setTimeout(super.cachedTimeout); 
    } 
    if (super.cachedPortName != null) { 
     _call.setPortName(super.cachedPortName); 
    } 

그러나 :

내가 사용자 이름과 암호가 설정되는 것을 볼

만 장소는 을 PortSoapBindingStub.createCall()에 ? 이 코드를 편집하고 수동으로 설정할 수 있지만 수신 오류를 유지하기 위해 노력 :

import java.net.MalformedURLException; 
import java.rmi.RemoteException; 
import javax.xml.rpc.ServiceException; 
import org.apache.axis.AxisFault; 
import org.apache.axis.client.Call; 

import ManterFornecedor.*; 

public class ManterFornecedor { 

    public static void main(String[] args) throws RemoteException, ServiceException, MalformedURLException { 

     InputMapping1 parameters = new InputMapping1(
       "fornecedor","contrato",java.util.Calendar.getInstance(), java.util.Calendar.getInstance(), 
       "produto",IC_STATUSType.Ativo 
       ); 


     java.net.URL endpoint = new java.net.URL("http://somewhere&amp;webService=ManterFornecedor"); 

     PortPortTypeProxy proxy = new PortPortTypeProxy(); 

     ManterFornecedorServiceLocator locator = new ManterFornecedorServiceLocator(); 
     ManterFornecedor.PortPortType port = locator.getPortSoap(); 

     PortSoapBindingStub client = new PortSoapBindingStub(endpoint,locator); 


     ManterFornecedor.OutputMapping1 response = proxy.novo(parameters); 

     System.out.println(response); 

    } 

} 

편집 :

여기
Exception in thread "main" AxisFault 
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException 
faultSubcode: 
faultString: java.lang.ArrayIndexOutOfBoundsException: -1 
faultActor: 
faultNode: 
faultDetail: 
    {http://xml.apache.org/axis/}hostname:myhost 

java.lang.ArrayIndexOutOfBoundsException: -1 
    at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222) 
    at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129) 
    at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source) 
    at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source) 
    at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(Unknown Source) 
    at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227) 
    at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696) 
    at org.apache.axis.Message.getSOAPEnvelope(Message.java:435) 
    at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:796) 
    at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:144) 
    at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32) 
    at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118) 
    at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83) 
    at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165) 
    at org.apache.axis.client.Call.invokeEngine(Call.java:2784) 
    at org.apache.axis.client.Call.invoke(Call.java:2767) 
    at org.apache.axis.client.Call.invoke(Call.java:2443) 
    at org.apache.axis.client.Call.invoke(Call.java:2366) 
    at org.apache.axis.client.Call.invoke(Call.java:1812) 
    at ManterFornecedor.PortSoapBindingStub.novo(PortSoapBindingStub.java:174) 
    at ManterFornecedor.PortPortTypeProxy.novo(PortPortTypeProxy.java:50) 
    at caixa.pedes.br.ManterFornecedor.main(ManterFornecedor.java:43) 

내 코드입니다 당신이 볼 수 있듯이, 나는 웹 서비스와 I에 새로운 해요 좀 잃었 어. 정확히 왜 그런지 모르지만 novo() 메서드는 Proxy, Locator 및 Stub에서 사용할 수 있습니다. 나는이 디자인 패턴에 대해 더 많이 읽겠습니다. 왜냐하면 저는 그것들을 처음 접했기 때문이며,이 3 가지 패턴 모두를 함께 사용하는 것은 더욱 까다 롭습니다.

WSDL 생성 연산자를 호출하는 데 가장 적합한 객체는 무엇입니까? 불행히도, Eclipse에서 작성된 클라이언트 코드는 JSP를 사용하여 매개 변수를 수신하며, 실제 코드 예제를 올바르게 분리 할 수 ​​없기 때문에 코드를 작성하고 클라이언트 운영자에게 호출 할 수 있습니다.

클라이언트가 구성 (엔드 포인트, 인증 등)을 제공하고 운영자를 호출해야했던 고유 클래스에 캡슐화 된 경우 훨씬 쉽습니다.

답변

0

당신은 PortTypeSoapBindingStub 클래스 setRequestHeaders(_call);에 이전에이 코드를 삽입해야합니다

try { 
     SOAPHeaderElement sopElement = new SOAPHeaderElement("urn:AuthenticationInfo","AuthenticationInfo") ; 
     sopElement.addChildElement("userName").addTextNode("XXXXX") ; 
     sopElement.addChildElement("password").addTextNode("XXXX"); 
     sopElement.addChildElement("authentication").addTextNode(""); 
     sopElement.addChildElement("locale").addTextNode(""); 
     sopElement.addChildElement("timeZone").addTextNode(""); 

     _call.addHeader(sopElement); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    }