복붙노트

[SPRING] WebServiceTemplate을 사용하여 SOAP 요청을 보내는 방법은 무엇입니까?

SPRING

WebServiceTemplate을 사용하여 SOAP 요청을 보내는 방법은 무엇입니까?

SOAP 웹 서비스에 요청을 보내려고합니다. 이 튜토리얼을 읽고 다음 코드를 준비했습니다. 그러나 튜토리얼은 하나의 요청에 초점을 맞추었지만 여러 SOAP 웹 서비스에 다른 요청을 보내려합니다. 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());

해결법

  1. ==============================

    1.다음 코드를 사용하면 xml 파일에 아무 것도 정의 할 필요가 없습니다.

    다음 코드를 사용하면 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();
            }
    
  2. ==============================

    2.서로 다른 SOAP 요청을 다른 SOAP 서비스로 보내려면 처리해야 할 모든 요청과 응답을 WebServiceTemplate이 인식하도록해야합니다.

    서로 다른 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 클래스에 응답 객체를 캐스팅 할 수 있습니다.

  3. ==============================

    3.SoapMessage가 marhsallable이라고 가정합니다.

    SoapMessage가 marhsallable이라고 가정합니다.

    동일한 메시지를 여러 엔드 포인트로 보내려면 송신 코드와 요청 핸들러를 반복하면됩니다.

    이 같은:

    {
        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

  4. ==============================

    4.당신이 찾고 있어야하는 예가 여기있다.

    당신이 찾고 있어야하는 예가 여기있다.

    비누에는 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";
    

    이 코드는 안드로이드로 작성되었으므로 일부 부분은 무시할 수 있지만 여전히 안드로이드 배경의 누군가가 그것에 대한 좋은 사용을 할 수있게 해줍니다.

    브라우저에서 [WSDL] [1]을 열고 서버에서 원격 메소드를 호출하는 데 중요한 사항을 확인하십시오.

    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);
        }
    }
    
  5. from https://stackoverflow.com/questions/34368029/how-to-send-a-soap-request-using-webservicetemplate by cc-by-sa and MIT license