web-dev-qa-db-ja.com

WebServiceTemplateを使用してSOAP=リクエストを送信するには?

SOAP Webサービスにリクエストを送信しようとしています。 このチュートリアル を読み、次のコードを準備しました。ただし、複数のSOAP Webサービスに異なるリクエストを送信しますが、チュートリアルでは1つのリクエストに焦点を当てました。 WebserviceTemplateを使用してSOAPリクエストを送信するにはどうすればよいですか?

WebServiceTemplate

    SoapMessage soapMsg = new SoapMessage();
    soapMsg.setUsername("Requester");
    soapMsg.setPassword("Pass");
    soapMsg.setLanguageCode("EN");
    Request request = new Request();
    request.setDeparture("FDH");
    request.setDestination("HAM");
    Date date = new Date();
    SimpleDateFormat frm2 = new SimpleDateFormat("yyyy-MM-dd");
    request.setDepartureDate(frm2.parse(frm2.format(date)));
    request.setNumADT(1);
    request.setNumCHD(0);
    request.setNumInf(0);
    request.setCurrencyCode("EUR");
    request.setWaitForResult(true);
    request.setNearByDepartures(true);
    request.setNearByDestinations(true);
    request.setRronly(false);
    request.setMetaSearch(false);
    soapMsg.setRequest(request);
    WebServiceTemplate webServiceTemplate = new WebServiceTemplate().  //how to create object and send request!
    Object response = webServiceTemplate.marshalSendAndReceive(
            "https://aaa5.elsyarres.net", soapMsg);
    Response msg = (Response) response;
    System.err.println("size of results of wogolo:"
            + msg.getFlights().getFlight().size());
21
Jack

次のコードを使用できます。xmlファイルで何も定義する必要はありません。

  try {
            SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory(
                    MessageFactory.newInstance());
            messageFactory.afterPropertiesSet();

            WebServiceTemplate webServiceTemplate = new WebServiceTemplate(
                    messageFactory);
            Jaxb2Marshaller marshaller = new Jaxb2Marshaller();

            marshaller.setContextPath("PACKAGE");
            marshaller.afterPropertiesSet();

            webServiceTemplate.setMarshaller(marshaller);
            webServiceTemplate.afterPropertiesSet();

            Response response = (Response) webServiceTemplate
                    .marshalSendAndReceive(
                            "address",
                            searchFlights);

            Response msg = (Response) response;
        } catch (Exception s) {
            s.printStackTrace();
        }
16
Daniel Newtown

異なるSOAP=リクエストを異なるSOAP=サービスに送信するには、処理する必要があるすべてのリクエストと応答をWebServiceTemplateに認識させる必要があります。

次のように、リクエストとレスポンスごとにJavaクラスを作成します。

package models;
import javax.xml.bind.annotation.XmlRootElement;
import Java.io.Serializable;

@XmlRootElement
public class FlyRequest implements Serializable {

    private boolean nearByDeparture;

    public FlyRequest() {}

    public boolean isNearByDeparture() {
        return nearByDeparture;
    }

    public void setNearByDeparture(boolean nearByDeparture) {
        this.nearByDeparture = nearByDeparture;
    }
}

(@XmlRootElementは、以下のJAXBマーシャラーを使用しているためです。詳細については、Jaxbリファレンスを参照してください)。

テンプレートのセットアップは、たとえば次のように行われます。

    SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory(MessageFactory.newInstance());
    messageFactory.afterPropertiesSet();

    WebServiceTemplate webServiceTemplate = new WebServiceTemplate(messageFactory);
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setContextPath("models");
    marshaller.afterPropertiesSet();

    webServiceTemplate.setMarshaller(marshaller);
    webServiceTemplate.afterPropertiesSet();

「models」は、jaxbがそれらを見つけることができるように、Request/Responsesクラスがあるパッケージの名前です。

次に、次のように、呼び出しを実行するクラスのリクエストをインスタンス化します。

    // call fly service:
    FlyRequest flyRequest = new FlyRequest();
    flyRequest.setNearByDeparture(false);
    Object flyResponse = webServiceTemplate.marshalSendAndReceive("https://example.net/fly", flyRequest);

    // call purchase service:
    PurchaseRequest purchaseRequest = new PurchaseRequest();
    purchaseRequest.setPrice(100);
    Object purchaseResponse = webServiceTemplate.marshalSendAndReceive("https://example.net/purchase", purchaseRequest);

同様に、応答オブジェクトを上記で定義したJAXBクラスにキャストできます。

8
smarquis

ここにあなたが探しているものの例があります

SoapにはRESTとは異なり多くの制限があり、ネットワーク呼び出しを機能させる前に満たす必要のあるいくつかの標準に従います。

ただし、Restとは異なり、Soapでは、WSDL URLがある場合、Soap呼び出しを呼び出すために必要なすべての情報を取得できます。

private final String NAMESPACE = "http://www.w3schools.com/webservices/";
private final String URL = "http://www.w3schools.com/webservices/tempconvert.asmx?WSDL";
private final String SOAP_ACTION = "http://www.w3schools.com/webservices/CelsiusToFahrenheit";
private final String METHOD_NAME = "CelsiusToFahrenheit";

このコードはAndroidで記述されているため、一部を無視できますが、Android background

開いた [WSDL][1]ブラウザで、サーバー上のリモートメソッドを呼び出すために重要なことを確認します。

1属性targetNamespaceが表示され、その値はNamespaceになります。この場合に使用するのはNamespace is http://www.w3schools.com/webservices/

2ここで、メソッドの名前が必要です。このWSDLには、それぞれint属性s:elementの値はメソッドの名前です。この場合、4つのメソッドはFahrenheitToCelsiusFahrenheitToCelsiusResponseCelsiusToFahrenheitCelsiusToFahrenheitResponseです。

3ここで、SOAP ActionこれはNAMESPACE+METHODしかし、WSDLはそれに関する情報も提供します。タグsoap:operationそして、soapAction属性はSoapアクションを持ちます。この場合、呼び出したい値はhttp://www.w3schools.com/webservices/CelsiusToFahrenheit

private class MyTask extends AsyncTask<Void, Void, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog.show();
    }

    @Override
    protected String doInBackground(Void... params) {
        try {
            SoapObject soapObject = new SoapObject(NAMESPACE, METHOD_NAME);

            soapObject.addProperty("Celsius","12");


            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.dotNet = true;
            envelope.setOutputSoapObject(soapObject);
            HttpTransportSE httpTransportSE = new HttpTransportSE(URL);

            httpTransportSE.call(SOAP_ACTION, envelope);
            SoapPrimitive soapPrimitive = (SoapPrimitive)envelope.getResponse();
            Log.d("TAG", "doInBackground: "+soapPrimitive.toString());

            return soapObject.toString();

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

        return null;
    }

    @Override
    protected void onPostExecute(String aVoid) {
        super.onPostExecute(aVoid);
        progressDialog.dismiss();
        textView.setText(""+aVoid);
    }
}
2
Pankaj Nimgade

SoapMessageがマーシャリング可能であると仮定します

同じメッセージを複数のエンドポイントに送信するには、送信コードとリクエストハンドラーでループするだけです。

このようなもの:

{
    String endpoint = "https://aaa5.elsyarres.net"
    WebServiceTemplate webServiceTemplate = new WebServiceTemplate().
    webServiceTemplate.setDefaultUri(endpoint);
    Object response = webServiceTemplate.marshalSendAndReceive(soapMsg);
    // handle you are response as you are currently doing.
    // Loop changing the endpoint as you need.
}

このコードは、Spring WebServiceTemplateを使用します

2
Mike Murphy