如何使用WebServiceTemplate发送SOAP请求?
我正在尝试向SOAP Web服务发送请求。 我阅读了本教程并准备了以下代码。 但是,我将向多个SOAP Web服务发送不同的请求,而本教程则关注一个请求。 如何使用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 marshaller;有关更多信息,请参阅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”是Request / Responses类所在的包的名称,因此jaxb可以找到它们。
然后,您只需实例化要执行调用的类的请求,如下所示:
// 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类。
假设您的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
这是一个你应该寻找的例子
与REST
不同,Soap有很多限制,它遵循一些必须满足的标准才能让网络呼叫工作,
但与Rest
不同,如果你有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背景可以很好地利用它
在浏览器中打开[WSDL][1]
并检查在服务器上调用远程方法的重要事项。
1您将看到一个属性
targetNamespace
其值为Namespace
,在这种情况下,您将使用Namespace
为http://www.w3schools.com/webservices/
2现在你需要方法的名称,这个
WSDL
有四个方法,每个都是int属性s:element
的值是方法的名称,在这种情况下,四个方法是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 { @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); } }