[SPRING] WebServiceTemplate을 사용하여 SOAP 요청을 보내는 방법은 무엇입니까?
SPRINGWebServiceTemplate을 사용하여 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.다음 코드를 사용하면 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.서로 다른 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.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.당신이 찾고 있어야하는 예가 여기있다.
당신이 찾고 있어야하는 예가 여기있다.
비누에는 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); } }
from https://stackoverflow.com/questions/34368029/how-to-send-a-soap-request-using-webservicetemplate by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] JPA / JTA / @ Transactional Spring 주석 (0) | 2018.12.15 |
---|---|
[SPRING] Hibernate 질의 결과를 커스텀 클래스에 매핑? (0) | 2018.12.15 |
[SPRING] Spring 4.0.0과 최대 절전 모드 4.30의 호환성 [duplicate] (0) | 2018.12.15 |
[SPRING] 다른 메서드에서 호출 한 트랜잭션 메서드가 트랜잭션을 가져 오지 않습니다. (0) | 2018.12.15 |
[SPRING] 스프링 부트로 Maven 리소스 필터링 : 자리 표시자를 해결할 수 없습니다. (0) | 2018.12.15 |