首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用WebServiceTemplate发送SOAP请求?

如何使用WebServiceTemplate发送SOAP请求?
EN

Stack Overflow用户
提问于 2015-12-19 06:29:17
回答 5查看 84.4K关注 0票数 29

我正在尝试向SOAP send服务发送请求。我阅读了本教程并编写了以下代码。但是,我将向多个SOAP one服务发送不同的请求,而教程则侧重于一个请求。如何使用WebserviceTemplate发送SOAP请求?

WebServiceTemplate

代码语言:javascript
复制
    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());
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-01-08 10:49:58

可以使用以下代码,不需要在xml文件中定义任何内容。

代码语言:javascript
复制
  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();
        }
票数 21
EN

Stack Overflow用户

发布于 2015-12-23 10:31:39

要向不同的SOAP服务发送不同的SOAP请求,只需要让WebServiceTemplate知道它必须处理的所有请求和响应。

为每个请求和响应创建Java类,如下所示:

代码语言:javascript
复制
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引用)。

例如,模板的设置如下:

代码语言:javascript
复制
    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();

“模型”是请求/响应类所在的包的名称,这样jaxb就可以找到它们。

然后,只实例化要执行调用的类的请求,如下所示:

代码语言:javascript
复制
    // 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
EN

Stack Overflow用户

发布于 2015-12-19 07:41:58

下面是一个你应该寻找的例子

Soap与REST不同,它有很多限制,它遵循一些标准,这些标准必须在网络调用开始工作之前得到满足,

但与Rest不同,在Soap中,如果您有WSDL URL,则可以获得调用Soap调用所需的所有信息

代码语言:javascript
复制
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,在本例中,Namespacehttp://www.w3schools.com/webservices/。 现在您需要方法的名称--这个WSDL有四个方法--每个方法都是are属性s:element,值就是方法的名称--在本例中,有四个方法是FahrenheitToCelsiusFahrenheitToCelsiusResponseCelsiusToFahrenheitCelsiusToFahrenheitResponse 现在您必须找出SOAP Action,也就是NAMESPACE+METHOD,但是WSDL也给出了有关这方面的信息,查找标记soap:operation和它的soapAction属性havs Soap操作,因为在本例中它的值是http://www.w3schools.com/webservices/CelsiusToFahrenheit

代码语言:javascript
复制
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);
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34368029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档