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());
次のコードを使用できます。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();
}
異なる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クラスにキャストできます。
ここにあなたが探しているものの例があります
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
ishttp://www.w3schools.com/webservices/
2ここで、メソッドの名前が必要です。この
WSDL
には、それぞれint属性s:element
の値はメソッドの名前です。この場合、4つのメソッドはFahrenheitToCelsius
、FahrenheitToCelsiusResponse
、CelsiusToFahrenheit
、CelsiusToFahrenheitResponse
です。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);
}
}
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を使用します