0

POSTリクエストを使用した後、Webサービスからの応答を読み取ろうとすると問題が発生します。便利なXMLを取り戻すことを期待していますが、代わりにHTMLだけを取得しています。

    URL url = new URL("https://abc.co.uk/someWS");
    String pKeyPassword = "xxxxxx";
    String xmlOutput = "someXML...";

    HttpsURLConnection con = (HttpsURLConnection) url.openConnection();

    //Load authentication certificate.
    KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
    KeyStore keyStore = KeyStore.getInstance("PKCS12");

    InputStream keyInput = new FileInputStream("/home/keystore.p12");
    keyStore.load(keyInput, pKeyPassword.toCharArray());
    keyInput.close();

    keyManagerFactory.init(keyStore, pKeyPassword.toCharArray());

    SSLContext context = SSLContext.getInstance("TLS");
    context.init(keyManagerFactory.getKeyManagers(), null, new SecureRandom());

    con.setSSLSocketFactory(context.getSocketFactory());

    // Tell the connection that we will be sending information
    con.setDoInput(true);
    con.setDoOutput(true);
    con.setRequestProperty("Content-Length", "" + xmlOutput.length());
    con.setRequestProperty("Content-Type", "text/xml; UTF-8");
    con.setRequestMethod("POST");

    con.connect();

    // Send the POST stream data
    DataOutputStream outputStream = new DataOutputStream(con.getOutputStream());
    outputStream.writeBytes(xmlOutput);

    // Read the response
    InputStream inputstream = con.getInputStream();
    InputStreamReader inputstreamreader = new InputStreamReader(inputstream);
    BufferedReader bufferedreader = new BufferedReader(inputstreamreader);

    // format response to a string
    String string = null;
    String response = "";
    while ((string = bufferedreader.readLine()) != null) {
      response += string;
    }
    con.disconnect();
    System.out.println(response);

接続しているWebサービスに問題はないと確信しており、POSTリクエストではなくGETリクエスト(HTMLを返す)を実行しようとしているように見えます。ここで何が問題なのですか?

4

2 に答える 2

0

HTMLを取得した場合は、サーバーエラーである可能性があります。サーバーログを読んで、その問題を検出してください。とにかく、soapUIアプリケーションを使用して、Webサービスが定義されて正しく機能していることを確認できます。

これが私のために働いたコードのスニペットです(パスワードを追加するだけです):

import org.apache.axis.AxisFault;
import org.apache.axis.SOAPPart;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.SOAPEnvelope;
import org.apache.axis.soap.MessageFactoryImpl;
....
String mHostAddr = "yourURL";
try {

        String envelope = getXML(); //redFromXmlFile();
        //String envelope = "";
        byte[] reqBytes = envelope.getBytes();
        ByteArrayInputStream bis = new ByteArrayInputStream(reqBytes);
        StreamSource ss = new StreamSource(bis);

        //Create a SOAP Message Object
        MessageFactoryImpl messageFactory = new MessageFactoryImpl();
        SOAPMessage msg = messageFactory.createMessage();
        SOAPPart soapPart = (SOAPPart) msg.getSOAPPart();

        //Set the soapPart Content with the stream source
        soapPart.setContent(ss);

        //Create a WebService Call
        Service service = new Service();
        Call call = (Call)service.createCall();
        call.setTargetEndpointAddress(mHostAddr);

        //Invoke the WebService.
        SOAPEnvelope resp = call.invoke(((org.apache.axis.SOAPPart)soapPart).getAsSOAPEnvelope());






    } catch (AxisFault ex) {
        System.out.println(ex.getMessage());
    } catch (ServiceException ex) {
        System.out.println(ex.getMessage());
    } catch (SOAPException ex) {
        System.out.println(ex.getMessage());
    } catch (RemoteException e) {
        e.printStackTrace();
    } 


....

それはあなたを助けるか、正しい方向を見つけるかもしれません

于 2012-11-02T22:49:30.123 に答える
0

あなたは自分のWebサービスを「難しい方法」(TM)と呼んでいるようです。

非常に簡単に呼び出すことができ、現在の問題に対処する必要がはるかに少ないスタブクラスを生成できるフレームワーク(Metro、CXFなど)が多数あります。wsimportはあなたの友達であり、問​​題のWSDLが正しくないかどうかを教えてくれます。

関連するリンクについては、この回答を参照してください。

于 2012-11-02T23:29:16.070 に答える