IT/Android

안드로이드에서 웹서비스 호출하기(wsdl)

김효랑이 2018. 10. 26. 09:59
728x90
반응형

 호야의 블로그 

[Android] 안드로이드에서 Soap wsdl 웹서비스 호출하기

자바 및 안드로이드에서 웹 서비스를 호출하는 연습 중입니다. 안드로이드 스튜디오에서 자체적으로는 지원하지 않아 ksoap2 라는 라이브러리를 사용하여야 합니다. 또한 웹서비스를 위한 wsdl 주소를 알아야 합니다. 여기서 wsdl이란 Web Services Description Language의 약자로 웹 서비스 기술언어 또는 기술된 정의 파일의 총칭으로 XML로 기술되는 언어 입니다. 웹 서비스의 구체적 내용이 기술되어 있어 서비스 제공 장소, 서비스 메시지 포맷, 프로토콜 등이 기술되어 기술된 내용을 읽고 활용이 가능합니다.


라이브러리 추가

먼저 ksoap2 라이브러리를 여기에서 다운받습니다. 이후 안드로이드 스튜디오에서 새 프로젝트를 만들고, file 아래에 아래와 같은 항목을 클릭하여 Project를 선택합니다.

아래와 같이 .gradle, .idea, app 등등 항목이 나오며 app/libs에 다운받은 ksoap2--.jar 파일을 복사하거나 옮겨 넣습니다.

libs의 라이브러리를 우클릭 후 Add As Library 버튼을 클릭하여 라이브러리를 설치합니다.

이렇게 라이브러리를 설치 완료하였습니다. 이 라이브러리 외에도 다른 라이브러리도 이런 식으로 프로젝트에 적용하시면 됩니다.


환경 설정

설치 이후 제대로 ksoap2를 이용하려면 Project를 다시 Android로 바꾸고 Manifest에 들어갑니다.

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

Manifest에 인터넷 권한을 주는 코드를 집어 넣습니다.
이후 액티비티에서 모듈을 사용하기 위해 라이브러리를 추가해줍니다.

import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import java.util.concurrent.ExecutionException; import org.ksoap2.transport.HttpTransportSE;

이제 웹서비스를 호출하기 위한 준비가 끝났습니다.


웹서비스 호출 간단한 예시

아래는 전체 예제 코드입니다. url은 예시이니 참고만 해주시면 되겠습니다.

import android.os.AsyncTask; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.widget.TextView; import org.ksoap2.SoapEnvelope; import org.ksoap2.serialization.SoapObject; import org.ksoap2.serialization.SoapSerializationEnvelope; import java.util.concurrent.ExecutionException; import org.ksoap2.transport.HttpTransportSE; public class MainActivity extends Activity { CallRemote cr = new CallRemote(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView)findViewById(R.id.textView1); tv.setText(call_process()); } public String call_process(){ AsyncTask<String, String, String> at = cr.execute("","",""); String s = null; try { s = at.get(); } catch (InterruptedException e) {e.printStackTrace(); } catch (ExecutionException e) {e.printStackTrace(); } return s; } }

class CallRemote extends AsyncTask<String, String, String>{ private static final String SOAP_ACTION = "http://soapinterop.org/definitions/echoString"; //웹에서 확인하면 함수 설명이 나옴(namespace + soap_method) private static final String SOAP_METHOD = "echoString"; //호출되는 함수의 이름 private static final String NAMESPACE = "http://soapinterop.org/definitions/"; //웹서비스 만들 때 기재 private static final String URL = "http://www.soapclient.com/interop/Import1.wsdl"; //웹서비스 위치 //접속을 위한 기본 정보 설정 public String doInBackground(String... params) { String results = null; try { SoapObject request = new SoapObject(NAMESPACE, SOAP_METHOD); request.addProperty("전달파라미터 변수명", "파라미터 값");//전달 파라미터(변수명 값 입력해야함) //웹서비스 호출 준비 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); envelope.dotNet=true; HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

androidHttpTransport.call(SOAP_ACTION, envelope); //웹서비스 호출(soap action 변수 사용) results = envelope.getResponse().toString(); //결과 출력(리턴값 가져옴) } catch (Exception e) { Log.e("SOAP Result", "Error: " + e.getMessage()); results = ""+e.fillInStackTrace(); } return results; } }

여기서 중요한 부분을 설명드리겠습니다. 아래 코드는 wsdl에 들어있는 정보들로 메소드를 호출하기 위한 사전 설정이라고 보시면 됩니다.

private static final String SOAP_ACTION = "http://soapinterop.org/definitions/echoString"; //웹에서 확인하면 함수 설명이 나옴(namespace + soap_method) private static final String SOAP_METHOD = "echoString"; //호출되는 함수의 이름 private static final String NAMESPACE = "http://soapinterop.org/definitions/"; //웹서비스 만들 때 기재 private static final String URL = "http://www.soapclient.com/interop/Import1.wsdl"; //웹서비스 위치 //접속을 위한 기본 정보 설정

아래와 같이 wsdl에는 네임스페이스, 메소드가 나와있어서 입력하는데 어려움이 없을 것입니다.

try에서 먼저 Soap Object를 생성하고, 파라미터를 입력합니다. 이후 웹서비스 호출을 위한 준비를 한 후 URL과 SOAP_ACTION을 이용해 웹서비스를 호출하고 리턴 값으 출력합니다.

try { SoapObject request = new SoapObject(NAMESPACE, SOAP_METHOD); request.addProperty("전달파라미터 변수명", "파라미터 값");//전달 파라미터(변수명 값 입력해야함)

//웹서비스 호출 준비 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); envelope.dotNet=true;

HttpTransportSE androidHttpTransport = new HttpTransportSE(URL); androidHttpTransport.call(SOAP_ACTION, envelope); //웹서비스 호출(soap action 변수 사용) results = envelope.getResponse().toString(); //결과 출력(리턴값 가져옴) }

catch에서는 에러를 탐지하여 웹서비스 연동에 실패하는 경우에 해당합니다.

catch (Exception e) { Log.e("SOAP Result", "Error: " + e.getMessage()); results = ""+e.fillInStackTrace(); }


후기 및 정리

웹서비스 호출의 기초를 알아보았습니다. 프로젝트를 통해 웹서비스 호출 과정이 쉽지 않다는 것을 느꼈습니다. 깊이 파고 들수록 복잡한 느낌입니다. 많은 분들이 최대한 다양한 예제로 이해를 하셨으면 좋겠습니다. 감사합니다.


조금의 도움이 되셨다면 로그인 없이도 가능한 댓글과

왼쪽 아래 ♥공감 버튼을 꾹 눌러주세요! 




728x90
반응형