5

XMLファイルをリクエストとしてSOAPサーバーに送信したい。これが私が持っているコードです:( org.apache.httpを使用してSOAPアクションでHTTPPostリクエストを送信することから変更されました)

import org.apache.http.client.*;
import org.apache.http.client.methods.*;
import org.apache.http.impl.client.*;
import org.apache.http.entity.StringEntity;
import org.apache.http.protocol.HTTP;
import org.apache.http.HttpResponse;
import java.net.URI;

public static void req()   {
        try {
            HttpClient httpclient = new DefaultHttpClient();
            String body="xml here";
            String bodyLength=new Integer(body.length()).toString();

            URI uri=new URI("http://1.1.1.1:100/Service");
            HttpPost httpPost = new HttpPost(uri);
            httpPost.setHeader( "SOAPAction", "MonitoringService" );
            httpPost.setHeader("Content-Type", "text/xml;charset=UTF-8");


            StringEntity entity = new StringEntity(body, "text/xml",HTTP.DEFAULT_CONTENT_CHARSET);
            httpPost.setEntity(entity);

            RequestWrapper requestWrapper=new RequestWrapper(httpPost);
            requestWrapper.setMethod("POST");


            requestWrapper.setHeader("Content-Length",bodyLength);
            HttpResponse response = httpclient.execute(requestWrapper);
            System.out.println(response);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

これまで、サーバーからエラー「http 500」(内部サーバーエラー)が発生していましたが、現在はまったく応答がありません。他のクライアントでは問題がないので、サーバーが正しく機能していることを私は知っています。

ありがとう。

4

2 に答える 2

6

org.apache.httpAPIはSOAP/Webサービスに対応していないため、標準的ではない方法でトリッキーな作業を行っています。このコードは、JavaオブジェクトデータをSOAP要求に自動的に「バインド」(変換)して、SOAP応答から外すことができないため、Javaに適していたり​​柔軟ではありません。デバッグして動作させるには少し時間がかかり、注意が必要で、脆弱です。障害処理などを含む完全なSOAPプロトコルを処理していますか?

JVMに組み込まれているJAX-WS標準の使用を提案できますか?

1. WSDLファイルをローカルディスクに保存します。
たとえば<app path>/META-INF/wsdl/abc.com/calculator/Calculator.wsdl
、WSDLがない場合は、ブラウザに入力して結果ページをディスクに保存できます。http:
//abc.com/calculator/Calculator?wsdl

2. wsimportコマンドを使用して、WSDLをJavaクラスファイルに変換します
。JDKの場合、ツールはにあり<jdkdir>\bin\wsimport.exe (or .sh)ます。
アプリサーバーの場合、次のようになります<app_server_root>\bin\wsimport.exe (or .sh)

<filepath>\wsimport -keep -verbose <wsdlpath>\Calculator.wsdl

または、WSDLが既存のWebサービスを介して利用できる場合

<filepath>\wsimport -keep -verbose http://abc.com/calculator/Calculator?wsdl

(「-pcom.abc.calculator」を含めて、生成されたクラスのパッケージを設定することもできます)

次のようなファイルが生成されます-これらのソースファイルをJavaプロジェクトに含めます。

com\abc\calculator\ObjectFactory.java       
com\abc\calculator\package-info.java       
com\abc\calculator\Calculator.java       ............................name = `<wsdl:portType>` name attribute      
com\abc\calculator\CalculatorService.java     ................name = `<wsdl:service>` name attribute    
com\abc\calculator\CalculatorRequestType.java  .......name = schema type used in input message    
com\abc\calculator\CalculatorResultType.java ..........name = schema type used in output message

2. JAX-WSSOAPWebサービスクライアントを作成します

package com.abc.calculator.client;

import javax.xml.ws.WebServiceRef;
import com.abc.calculator.CalculatorService;
import com.abc.calculator.Calculator;

public class CalculatorClient {

    @WebServiceRef(wsdlLocation="META-INF/wsdl/abc.com/calculator/Calculator.wsdl")
    // or @WebServiceRef(wsdlLocation="http://abc.com/calculator/Calculator?wsdl")
    public static CalculatorService calculatorService;

    public CalculatorResponseType testCalculation() {
        try {
            CalculatorRequestType request = new CalculatorRequest();
            request.setSomeParameter("abc");
            request.setOtherParameter(3);
            Calculator calculator = calculatorService.getCalculatorPort();
            // automatically generate SOAP XML message, send via HTTP, 
            // receive & marshal response to java object 
            String response = calculator.doCalculation(response);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
}
于 2012-11-07T11:22:12.633 に答える
2

このようにリクエストを送ってみてください。これは私が前回やった方法です:

try
        {
            StringBuffer strBuffer = new StringBuffer();
            HttpURLConnection connection = connectToEndPoint(endpoint);
            OutputStream outputStream = generateXMLOutput(connection, yourvalue, strDate);

            InputStream inputStream = connection.getInputStream();

            int i;
            while ((i = inputStream.read()) != -1) {
                Writer writer = new StringWriter();
                writer.write(i);
                strBuffer.append(writer.toString());

            String status = xmlOutputParse(strBuffer);

そして使用される機能:

private static HttpURLConnection connectToEndPoint(String wsEndPoint) throws MalformedURLException, IOException {
    URL urlEndPoint = new URL(wsEndPoint);
    URLConnection urlEndPointConnection = urlEndPoint.openConnection();
    HttpURLConnection httpUrlconnection = (HttpURLConnection) urlEndPointConnection;
    httpUrlconnection.setDoOutput(true);
    httpUrlconnection.setDoInput(true);
    httpUrlconnection.setRequestMethod("POST");
    httpUrlconnection.setRequestProperty("content-type", "application/soap+xml;charset=UTF-8");
    // set connection time out to 2 seconds
    System.setProperty("sun.net.client.defaultConnectTimeout", String.valueOf(2 * 1000));
    // httpUrlconnection.setConnectTimeout(2*1000);
    // set input stream read timeout to 2 seconds
    System.setProperty("sun.net.client.defaultReadTimeout", String.valueOf(2 * 1000));
    // httpUrlconnection.setReadTimeout(2*1000);
    return httpUrlconnection;
}

xml を手動で作成する場所 (必要に応じて変更):

private static OutputStream generateXMLOutput(HttpURLConnection conn, String msisdn, String strDate) throws IOException {
    OutputStream outputStream = conn.getOutputStream();

    StringBuffer buf = new StringBuffer();

    buf.append("<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ins=\"http://yournamespace">\r\n");
    buf.append("<soap:Header xmlns:wsa=\"http://www.w3.org/2005/08/addressing\">\r\n");

    //..... append all your lines .......       

    OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");

    outputStreamWriter.write("<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ins=\"http://yournamespace\">\r\n");
    outputStreamWriter.write("<soap:Header xmlns:wsa=\"http://www.w3.org/2005/08/addressing\">\r\n");
    //..... write all your lines .......    

    outputStreamWriter.flush();

    outputStream.close();
    return outputStream;
}

そして、WS の回答を返す関数:

private static String xmlOutputParse(StringBuffer xmlInputParam) throws IOException, ParserConfigurationException, SAXException {
    String status = null;
    DocumentBuilderFactory docBuilderfFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder documentBuilder = docBuilderfFactory.newDocumentBuilder();
    InputSource inputSource = new InputSource();
    inputSource.setCharacterStream(new StringReader(xmlInputParam.toString()));
    Document document = documentBuilder.parse(inputSource);
    NodeList nodeList = document.getElementsByTagName("ResponseHeader");
    Element element = (Element) nodeList.item(0);
    if (element == null) {
        return null;
    }
    NodeList name = element.getElementsByTagName("Status");
    Element line = (Element) name.item(0);
    if (line == null) {
        return null;
    }
    if (line.getFirstChild() instanceof CharacterData) {
        CharacterData cd = (CharacterData) line.getFirstChild();
        status = cd.getData().trim();
    }
    return status;
}

この解決策は(長いですが)ほとんどの場合に機能すると思います。ニーズに合わせて調整していただければ幸いです。

よろしくお願いします !

于 2012-11-09T15:52:27.940 に答える