본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Java(자바)

자바 Soap 클라이언트 간단하게 구현하기

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2019. 9. 2.

 

 

요즘 Rest형식의 서버를 운용하는 경우 Json 방식으로 많이들 운용하는데.. 가끔 Soap 방식으로 데이터를 주고 받는 서버가 있는 경우가 있다.

SOAP형식이 지원하는 wsdl 파일을 읽어와서 하는방법과, 아파치 라이브러리를 활용하는 방법, 그리고 일반 http 클라이언트를 활용하는 방법이 있다.

 

아파치에서 제공하는 라이브러리를 활용한다면 아래 CXF 라이브러리를 받아서 구현해야 된다.

Apache CXF 라는 라이브러리를 다운받자. * maven 기준

<!-- CXF -->  
<dependency>  
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>2.7.11</version>
</dependency>  
<dependency>  
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>2.7.11</version>
</dependency>  

이후에 요청하는 클라이언트를 만들어 줘야하는데 대략적인 코드는 아래와 같다.

    String endpointAddress = "연결 대상";
    
    QName serviceName = new QName("xml에들어가는 서비스 주소", "서비스이름");
    QName portName = new QName("xml에들어가는 서비스 주소", "포트이름");
    
    Service service = Service.create(serviceName);
    
    service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointAddress);
    
    Dispatch dispatch = service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE);
    BindingProvider bp = (BindingProvider) dispatch;
    MessageFactory factory = ((SOAPBinding) bp.getBinding()).getMessageFactory();
    //..이하 생략

뭔가 각종 외부 클래스를 가져와야 하고..내용도 길고..새로 문법도 익혀야되서 많이 힘들다(?)

 

그래서 간단하게 구현하려면 요청하는 xml형태만 확인후에 HttpURLConnection을 활용하면 편하다.

아래 소스코드처럼 일반 HTTP 클라이언트를 활용하면 쉽게 가능하다.

		String xml = "보낼 xml 값";
		OutputStreamWriter wr = null;
		BufferedReader in = null;
		
		URL url = new URL(careUrl);  //보낼 주소
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();
			
		conn.setDoOutput(true);
		conn.setRequestMethod("POST");
		conn.addRequestProperty("Content-Type", "text/xml");
		wr = new OutputStreamWriter(conn.getOutputStream());
		wr.write(xml);
		wr.flush();
		int code = conn.getResponseCode();
        
		String inputLine = null;
		StringBuffer buffer = new StringBuffer();
		in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
		while ((inputLine = in.readLine()) != null) {
			buffer.append(inputLine);
		}
		System.out.println(buffer.toString());        //결과 값

Soap 방식으로 간단하게 구현할 것이라면 HttpURLConnection을 활용한 방법이 낫지만, 만약 복잡하고 여러분야에서 계속 요청해야 된다면 아파치 라이브러리를 활용한 방법을 익혀서 하는 것이 낫다.

 

추가적으로 만약 Soap 요청하는 주소의 서비스에 파라미터가 존재한다면, 아파치 라이브러리에서는 전부 써 주어야 하지만 맨 아래의 HttpURLConnection방식에서는 파라미터를 제거해야 정상적으로 응답한다.

* 아파치 라이브러리를 사용하면 -> http://주소?wsdl 

* HttpURLConnection를 사용하면 -> http://주소

 

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글