Wo legen Sie username und Passwort in der Web-Service-client?

War ich soweit dies WSDL, und ich habe zu entwickeln, die ein client für die es (ich habe Fragen, die hier über lol).

<?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>

Sofern ich die vollständige WSDL -, aber der wichtige Teil der Frage ist

    <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>

Wie Sie sehen können, Eingang hat einen ARAuthenticate-Nachricht in der Kopfzeile, die ist

<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>

Ich benutzte Eclipse-Web Services Explorer zu erstellen, die eine WS-client zum testen von diesem webservice verwendet, und es funktionierte! Dieser client hat username und Kennwort in den entsprechenden Feldern festgelegt werden.

Ok, jetzt muss ich an das client-Beispiel-code und implementieren Sie eine eigenständige (nicht-web-UI) - Lösung sammelt Informationen und verwendet der client an den server senden. Aber es ist nicht, und ich glaube, dass es ist, weil die Authentifizierung.

Einzige Ort, sehe ich Benutzername und Kennwort festgelegt wird, ist in PortSoapBindingStub.createCall():

    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);
    }

Aber, wo sind diese zwischengespeicherten Sachen aus? Ich habe versucht diesen code Bearbeiten und manuell eingestellt, aber halten erhalten Fehler:

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)

Hier ist mein code:

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);

    }

}

Edit: wie Sie sehen können, ich bin neu in Web-Service, und ich bin irgendwie verloren. Ich weiß nicht, exactally, warum, aber die novo () - Methode steht in den Proxy -, Locator-und Stub. Ich werde Lesen Sie mehr über diese design-patterns, weil ich bin neu auf Sie zu, und mit allen 3 gemeinsam ist auch mehr lästig.

Was ist das beste Objekt zum Aufruf WSDL generierten Operatoren? Unfortuntely, client-code in Eclipse verwendet JSP-Parameter empfangen, und ich bin nicht in der Lage, richtig zu isolieren exemple code zu echten client, so dass ich mich entwickeln kann, meinen code und rufen Sie die client-Betreibers.

Es wäre viel einfacher, wenn der AUFTRAGGEBER war, eingekapselt in eine einzigartige Klasse, wo ich gerade hatte, um seine configs (Endpunkt, Authentifizierung, etc) und dann rufen Sie den operator.

InformationsquelleAutor Hikari | 2013-01-16
Schreibe einen Kommentar