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를 사용하지 않았습니다. 전화를 거는 방법은 다음과 같습니다.
- Java 표준 API를 사용하여 간단한 HTTP 연결을 작성하십시오
HttpURLConnection
. - SOAP 요청을 형성하십시오. SOAPUI를 사용하여 SOAP 요청을 작성할 수 있습니다.
- doOutPut 플래그를 true로 설정하십시오.
- content-length, Content type 및 User-agent와 같은 HTTP 헤더 값을 설정하십시오. Content-length 값은 필수이므로 설정하는 것을 잊지 마십시오.
- SOAP 요청 전체를 출력 스트림에 씁니다.
- 메소드를 호출하여 연결하고 응답을 받으십시오 (제 경우에는 사용했습니다
getResonseCode
). - 응답 코드가 다음과 같은 경우
- 웹 서비스를 성공적으로 호출했음을 의미합니다.
- 이제 동일한 HTTP 연결에서 입력 스트림을 가져 와서 문자열 객체를받습니다. 이 문자열 객체는 SOAP 응답입니다.
- 응답 코드가 200이 아닌 경우
ErrorInput
동일한 HTTPobject 에서 스트림 을 취하고 오류가있는 경우 오류를 수신하십시오. - 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);
}
}
}