1

Stackoverflow でこの質問を検索したところ、同様の質問がいくつか見つかりましたが、どれも私の問題を解決しませんでした。「提案された」ソリューションをすべてコンパイルしましたが、何も機能しません:-( wsdl があり、adb client(Axis 2) を使用してクライアント コードを生成しました。wsdl は、この要求が Https URL 経由で送信されることを示しています。 wsdl を使用して Java へのスタブを作成します。ただし、基本認証の方法がわかりません。詳細を説明しているドキュメントには、ユーザー名と pwd は Base64 を使用してエンコードする必要があると記載されています。

使用される認証方法は HTTP Basic です。ユーザー名とパスワードは、base64 形式 (UTF8 文字セット) でエンコードする必要があります。

例: ユーザー名:パスワード = 「VXNlcm5hbWU6UGFzc3dvcmQ=」</p>

ところで、SOAP UI でこの wsdl を試してみたところ、正しい応答が得られましたが、Java コードが機能しない場合がありました。

今ここにwsdlがあります

<?xml version="1.0" encoding="UTF-8"?>
<definitions targetNamespace="urn:OTSB2B" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:impl="urn:OTSB2B" xmlns:intf="urn:OTSB2B" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <wsdl:types>
        <schema targetNamespace="urn:OTSB2B" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:urn="urn:OTSB2B">
            <simpleType name="tn">
                <restriction base="string">
                    <length value="10"/>
                </restriction>
            </simpleType>
            <simpleType name="prov">
                <restriction base="string">
                    <length value="2"/>
                    <enumeration value="on"/>
                    <enumeration value="qc"/>
                </restriction>
            </simpleType>
            <element name="getPresaleByTN">
                <complexType>
                    <sequence>
                        <element name="tn" type="urn:tn"/>
                        <element name="prov" type="urn:prov"/>
                    </sequence>
                </complexType>
            </element>
            <element name="getPresaleByTNReturn" type="xsd:string"/>
            <element name="isAlive"/>
            <element name="isAliveReturn" type="xsd:boolean"/>
        </schema>
    </wsdl:types>
    <message name="isAliveRequest">
        <part element="impl:isAlive" name="isAlive"/>
    </message>
    <message name="getPresaleByTNRequest">
        <part element="impl:getPresaleByTN" name="getPresaleByTN"/>
    </message>
    <message name="isAliveResponse">
        <part element="impl:isAliveReturn" name="isAliveReturn"/>
    </message>
    <message name="getPresaleByTNResponse">
        <part element="impl:getPresaleByTNReturn" name="getPresaleByTNReturn"/>
    </message>
    <portType name="GetPresaleByTN">
        <operation name="getPresaleByTN">
            <input message="impl:getPresaleByTNRequest" name="getPresaleByTNRequest"/>
            <output message="impl:getPresaleByTNResponse" name="getPresaleByTNResponse"/>
        </operation>
        <operation name="isAlive">
            <input message="impl:isAliveRequest" name="isAliveRequest"/>
            <output message="impl:isAliveResponse" name="isAliveResponse"/>
        </operation>
    </portType>
    <binding name="DominoSoapBinding" type="impl:GetPresaleByTN">
        <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="getPresaleByTN">
            <wsdlsoap:operation soapAction=""/>
            <input name="getPresaleByTNRequest">
                <wsdlsoap:body use="literal"/>
            </input>
            <output name="getPresaleByTNResponse">
                <wsdlsoap:body use="literal"/>
            </output>
        </operation>
        <operation name="isAlive">
            <wsdlsoap:operation soapAction=""/>
            <input name="isAliveRequest">
                <wsdlsoap:body use="literal"/>
            </input>
            <output name="isAliveResponse">
                <wsdlsoap:body use="literal"/>
            </output>
        </operation>
    </binding>
    <service name="GetPresaleByTNService">
        <port binding="impl:DominoSoapBinding" name="Domino">
            <wsdlsoap:address location="https://b2b.ivv.bell.ca/ots-qualification-service-tn"/>
        </port>
    </service>
</definitions>

私はこれを試しました:

GetPresaleByTNServiceStub stub = new GetPresaleByTNServiceStub();
            ServiceClient client = stub._getServiceClient();
            client.addStringHeader(new QName("userName"), "XXX");
            client.addStringHeader(new QName("password"), "YYYYYYYY");

            GetPresaleByTNServiceStub.GetPresaleByTN request = new GetPresaleByTN();
            Tn tn = new Tn();
            tn.setTn("4164390001");
            request.setTn(tn);
            request.setProv(Prov.on);

            GetPresaleByTNReturn response = stub.getPresaleByTN(request);
            System.out.println(response.getGetPresaleByTNReturn());

これにより、次のエラーが発生します。

org.apache.axis2.AxisFault: 文字列ヘッダーの追加に失敗しました。com.dinesh.bellAxis.App の org.apache.axis2.client.ServiceClient.addStringHeader(ServiceClient.java:434) に QName の名前空間 URI が必要です。メイン (App.java:30)

それから私はこれを試しました

GetPresaleByTNServiceStub stub = new GetPresaleByTNServiceStub();
            ServiceClient client = stub._getServiceClient();

            HttpTransportProperties.Authenticator basicAuth = new HttpTransportProperties.Authenticator();
            basicAuth.setUsername("XXX");
            basicAuth.setPassword("CCCCC");
            basicAuth.setPreemptiveAuthentication(true);

            stub._getServiceClient().getOptions().setProperty(HTTPConstants.AUTHENTICATE, basicAuth);

            GetPresaleByTNServiceStub.GetPresaleByTN request = new GetPresaleByTN();
            Tn tn = new Tn();
            tn.setTn("4164390001");
            request.setTn(tn);
            request.setProv(Prov.on);

            GetPresaleByTNReturn response = stub.getPresaleByTN(request);
            System.out.println(response.getGetPresaleByTNReturn());

これにより、次のエラーが表示されます。

org.apache.axis2.AxisFault: トランスポート レベル情報が、org.apache.axis2.transport.TransportUtils.createSOAPMessage(TransportUtils) の org.apache.axis2.AxisFault.makeFault(AxisFault.java:430) の SOAP メッセージ名前空間 URI と一致しません.java:90) org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:353) org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:416) org.apache.axis2. description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:228) at org.apache.axis2.client.OperationClient.execute(OperationClient.java:163) at com.acn.client.GetPresaleByTNServiceStub.getPresaleByTN(GetPresaleByTNServiceStub.java:460)

次に私はこれを試しました:これはWSセキュリティであり基本認証ではないため、間違っていると思いますが、すべてのオプションを使い果たしました

GetPresaleByTNServiceStub stub = new GetPresaleByTNServiceStub();
            ServiceClient client = stub._getServiceClient();

            OMFactory omFactory = OMAbstractFactory.getOMFactory();
            OMElement omSecurityElement = omFactory.createOMElement(new QName( "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", "Security", "wsse"), null);


            OMElement omusertoken = omFactory.createOMElement(new QName("http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", "UsernameToken", "wsu"), null);

            OMElement omuserName = omFactory.createOMElement(new QName("", "Username", "wsse"), null);
            omuserName.setText("XXXX");

            OMElement omPassword = omFactory.createOMElement(new QName("", "Password", "wsse"), null);
            omPassword.addAttribute("Type","http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText",null );
            omPassword.setText("YYYYYYY");

            omusertoken.addChild(omuserName);
            omusertoken.addChild(omPassword);
            omSecurityElement.addChild(omusertoken);
            stub._getServiceClient().addHeader(omSecurityElement);

            GetPresaleByTNServiceStub.GetPresaleByTN request = new GetPresaleByTN();
            Tn tn = new Tn();
            tn.setTn("4164390001");
            request.setTn(tn);
            request.setProv(Prov.on);

            GetPresaleByTNReturn response = stub.getPresaleByTN(request);
            System.out.println(response.getGetPresaleByTNReturn());

これにより、次のエラーが発生します。

スレッド「メイン」の例外 java.lang.IllegalArgumentException: org.apache の org.apache.axiom.om.impl.llom.OMElementImpl.handleNamespace(OMElementImpl.java:186) で空の名前空間名を持つプレフィックス付き要素を作成できません。 axiom.om.impl.llom.OMElementImpl.(OMElementImpl.java:161) org.apache.axiom.om.impl.llom.factory.OMLinkedListImplFactory.createOMElement(OMLinkedListImplFactory.java:126) com.dinesh.bellAxis.App2 .main(App2.java:37)

次に何をすべきかわからないので、Apache Axis2 に関するすべてのドキュメントをチェックし、あらゆる場所でグーグル検索しましたが、コードを機能させることができました。

助言がありますか

4

2 に答える 2

0

コード フラグメント 1 と 3 は、SOAP (フラグメント 1) または XML (フラグメント 3) に関して無効なメッセージを作成しようとするため、機能しません。いずれにせよ、メッセージに SOAP ヘッダーを追加しようとしますが、これは基本認証とは関係ありません。

コード フラグメント 2 は正しいようです。例外のスタック トレース (より正確にはhandleResponseメソッドの存在) から、応答に問題があることがわかります。エラー メッセージは、応答のコンテンツ タイプが実際に応答で使用されている SOAP バージョンと一致しないことを示している可能性があります。これは、クライアントではなく、サービスに問題があることを意味します。

于 2012-12-22T17:43:14.223 に答える
0

多くの試行錯誤とOracle WebサイトのSAAjチュートリアルを調べた後、答えを見つけました。

この String authorization = new sun.misc.BASE64Encoder().encode((“myUserName”+”:”+”myPassword”).getBytes()); を使用して基本認証を行うことができます。headers.addHeader(“承認”, “基本” + 承認);

これが完全なチュートリアルです - http://www.javahabit.com/2014/10/17/quick-tutorial-saaj-api/

于 2014-10-20T13:31:00.733 に答える