[java] Android에서 SOAP 웹 서비스를 호출하는 방법 [닫기]

Android에서 표준 SOAP / WSDL 웹 서비스를 호출하는 방법에 대한 좋은 정보를 찾는 데 많은 어려움을 겪고 있습니다. 내가 찾은 모든 것은 매우 복잡한 문서와 “kSoap2″에 대한 참조이며 SAX를 사용 하여 수동으로 파싱하는 것에 관한 약간의 비트 입니다. 좋습니다, 괜찮습니다.하지만 2008 년입니다. 표준 웹 서비스를 호출하기위한 좋은 라이브러리가 있어야한다고 생각했습니다.

웹 서비스는 기본적으로 NetBeans 에서 작성된 것입니다 . 배관 클래스 생성을위한 IDE 지원을 원합니다. Android 기반 전화에서 WSDL 기반 웹 서비스 에 연락하는 가장 쉽고 가장 우아한 방법이 필요합니다 .



답변

안드로이드는 어떠한 종류의 SOAP 라이브러리도 제공하지 않습니다. 직접 작성하거나 kSOAP 2 와 같은 것을 사용할 수 있습니다 . 아시다시피, 다른 사람들은 자신의 프로젝트에서 kSOAP2를 컴파일하고 사용할 수 있었지만 꼭 그럴 필요는 없었습니다.

구글은 지금까지 안드로이드에 SOAP 라이브러리를 추가하는 것에 관심이 거의 없다고 밝혔다. 이것에 대한 나의 의심은 웹 서비스에서 REST 기반 서비스에 대한 현재 추세를 지원하고 JSON을 데이터 캡슐화 형식으로 사용한다는 것입니다. 또는 메시징에 XMPP를 사용합니다. 그러나 그것은 단지 추측입니다.

XML 기반 웹 서비스는 현재 안드로이드에서 사소한 작업이 아닙니다. NetBeans를 알지 못하면 거기에서 사용 가능한 도구를 말할 수는 없지만 더 나은 라이브러리를 사용할 수 있다는 데 동의합니다. XmlPullParser가 SAX를 사용하지 못하게 할 수도 있지만 그에 대해서는 잘 모릅니다.


답변

org.apache.http.impl.client.DefaultHttpClient기본적으로 Android SDK로 제공됩니다. WSDL에 연결됩니다.

HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.example.com/" + URL);
HttpResponse response = httpClient.execute(httpGet, localContext);


답변

오버 헤드로 인해 모바일 장치와의 데이터 교환에 SOAP가 최선의 선택이 아니라는 것은 사실입니다. 그러나 서버 출력 형식을 제어하지 않는 상황에 처할 수 있습니다.

따라서 SOAP를 고수 해야하는 경우 Android 용으로 패치 된 kSOAP2 라이브러리가 있습니다 :
http://code.google.com/p/ksoap2-android/


답변

모바일 장치 (특히 Android 전화)에서 웹 서비스를 호출하기 위해 매우 간단한 방법을 사용했습니다. 웹 서비스를 호출하기 위해 웹 서비스 클라이언트 API를 사용하지 않았습니다. 전화를 거는 방법은 다음과 같습니다.

  1. Java 표준 API를 사용하여 간단한 HTTP 연결을 작성하십시오
    HttpURLConnection.
  2. SOAP 요청을 형성하십시오. SOAPUI를 사용하여 SOAP 요청을 작성할 수 있습니다.
  3. doOutPut 플래그를 true로 설정하십시오.
  4. content-length, Content type 및 User-agent와 같은 HTTP 헤더 값을 설정하십시오. Content-length 값은 필수이므로 설정하는 것을 잊지 마십시오.
  5. SOAP 요청 전체를 출력 스트림에 씁니다.
  6. 메소드를 호출하여 연결하고 응답을 받으십시오 (제 경우에는 사용했습니다
    getResonseCode).
  7. 응답 코드가 다음과 같은 경우
    1. 웹 서비스를 성공적으로 호출했음을 의미합니다.
  8. 이제 동일한 HTTP 연결에서 입력 스트림을 가져 와서 문자열 객체를받습니다. 이 문자열 객체는 SOAP 응답입니다.
  9. 응답 코드가 200이 아닌 경우 ErrorInput동일한 HTTPobject 에서 스트림 을 취하고 오류가있는 경우 오류를 수신하십시오.
  10. SAXParser (필자의 경우) 또는 DOMParaser 또는 다른 구문 분석 메커니즘을 사용하여 수신 된 응답을 구문 분석하십시오.

Android 전화에 대해이 절차를 구현했으며 성공적으로 실행되고 있습니다. 700KB 이상인 경우에도 응답을 구문 분석 할 수 있습니다.


답변

SOAP는 필요한 처리 / 파싱 오버 헤드로 인해 Android (또는 일반적으로 모바일 장치)에서 사용하기에 적합하지 않은 기술입니다. REST 서비스는 더 가벼운 솔루션이며 이것이 제가 제안하는 것입니다. Android에는 SAX 파서가 제공되며 사용하기가 매우 간단합니다. 모바일 장치에서 SOAP를 처리 / 파싱해야하는 경우, 죄송합니다. SOAP를 사용하지 않는 것이 좋습니다.


답변

약 1 년 전에 Android에서 SOAP 호출을 수행하는 방법을 알아 내려고하는이 스레드를 읽었습니다 .HttpClient를 사용하여 자체 빌드를 제안하면 Android 용 SOAP 라이브러리를 작성하게되었습니다.

얼음 비누

기본적으로 간단한 Java API를 통해 보낼 봉투를 만든 다음 XPath를 통해 정의한 객체로 봉투를 자동으로 구문 분석합니다. 예를 들면 다음과 같습니다.

<Dictionary>
    <Id></Id>
    <Name></Name>
</Dictionary>

된다 :

@XMLObject("//Dictionary")
public class Dictionary {
    @XMLField("Id")
    private String id;

    @XMLField("Name")
    private String name;
}

나는 그것을 내 자신의 프로젝트에 사용하고 있었지만 다른 사람들에게 도움이 될 것이라고 생각했기 때문에 그것을 분리하고 문서화하는 데 시간을 보냈습니다. “SOAP Android”를 인터넷 검색하는 동안이 스레드를 우연히 발견 한 일부 불쌍한 영혼이 그것을 가져다 줄 수 있다면 정말 좋겠습니다.


답변

프로젝트에 ksoap2.jar을 추가하는 것을 잊지 말고 AndroidManifest 파일에 인터넷 권한을 추가하십시오.

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class WebserviceActivity extends Activity {

    private static final String NAMESPACE = "https://api.authorize.net/soap/v1/";
    private static final String URL ="https://apitest.authorize.net/soap/v1/Service.asmx?wsdl";
    private static final String SOAP_ACTION = "https://api.authorize.net/soap/v1/AuthenticateTest";
    private static final String METHOD_NAME = "AuthenticateTest";
    private TextView lblResult;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        lblResult = (TextView) findViewById(R.id.tv);

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
        request.addProperty("name","44vmMAYrhjfhj66fhJN");
        request.addProperty("transactionKey","9MDQ7fghjghjh53H48k7e7n");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try {
            androidHttpTransport.call(SOAP_ACTION, envelope);

            //SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            // SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;


            lblResult.setText(resultsRequestSOAP.toString());
            System.out.println("Response::"+resultsRequestSOAP.toString());


        } catch (Exception e) {
            System.out.println("Error"+e);
        }

    }
}