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


553

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

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


안드로이드에서 SOAP를 사용 하는 방법
Jainendra

이전에 MS VS에 익숙한 사람이 Android 용 Mono를 사용하면 데이터 서비스 및 웹 서비스와 관련된 많은 문제를 해결할 수 있지만 모든 것이 간단하고 빠르게 개발됩니다. 또한 C # (Java와 매우 유사한 코드)에 익숙하지 않은 사람은 모든 라이브러리가 동일한 메소드를 가지며 일부 함수는 속성으로 대체되므로 이름은 거의 동일하며 Android에 대해 Java에서 이전에 작성한 사람은 자신의 경험을 사용하여 C #을 작성할 수 있습니다. 암호.
유진 보시 코프

Ksoap2 사용하여 안드로이드에서 웹 서비스에 접근에 링크 그것을 가지고 설명 Eaxample 아래에서보세요 액세스 안드로이드에서 Webservice를
프레드 Ondieki을

.Net Core를 사용하는 Xamarin / C #에서 이것이 가능하다고 생각합니다. 참조 : blogs.msdn.microsoft.com/webdev/2016/05/25/…
Vahid Amiri

Spring 의이 도구 는 유망 해 보인다.
Louis

답변:


245

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

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

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


7
예, REST 프록시를 작성해야한다고 생각합니다. 구글이 SOAP 지원을 제공하는데 관심이 없다는 것은 꽤 이상하게 보인다. kSoap 방법을 시도했지만 실제로는 심각한 대안이 아닙니다. 기껏해야 뉴스 그룹에 대한 많은 수색이 필요한 것은 추악한 일이었습니다.
BobbyShaftoe

19
그 이유는 SOAP가 매우 장황하며 모바일 컴퓨팅의 제약 조건을 제대로 충족시키지 못하기 때문일 수 있습니다.

92
누군가가 안드로이드 앱으로 웹 서비스를 호출 하는 가장 좋은 대안제안 할 수 있다면이 대답은 향상 될 것 입니다. 사람들이이 질문을 찾아서 읽고 나면 대부분의 사람들이 찾는 것입니다.
MGOwen 2009

4
SOAP 처리는 JSON과 같은보다 간결한 형식에 비해 메모리와 프로세서를 많이 사용합니다.
Jeremy Edwards

3
@ MGOwen 내가 볼 수있는 가장 좋은 대안은 프록시입니다. WSDL2Java를 통해 SOAP 엔벨로프를 프록시하는 REST-ful 인터페이스를 구현하십시오.

99

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);

5
예, 이것은 모든 것을 수동으로 파싱 해야하는 경로 일 것입니다. 객체 지향 접근 방식을 얻지 못할 것입니다.
BobbyShaftoe

93
당신은 무료 점심을 먹지 않을 것임을 의미합니다. 수동 구문 분석은 OO와 관련이 없습니다. 가장 고급 도구 인 HB1 연필로 종이에있는 모든 것을 파싱 할 수 있으며 여전히 OO입니다.
Neil

8
저자는 OO가 Java-XML 바인딩을 의미한다고 생각합니다. 이 접근법에서 응답을 구문 분석하기위한 다음 단계는 무엇입니까? 그리고 트리 구조로 구성된 수백 개의 요소가 있다면?
rustyx

12
BTW, SOAP로 운이 좋으려면 적어도 HTTP POST가 GET이 아닌 것으로 기대합니다. 또한 Accept 및 SOAPAction 헤더는 어디에 있습니까? 정말로 특공대를 가고 싶다면 SOAP 서비스를 소비하는 데이 4 줄 이상이 필요합니다.
rustyx

6
@NeilD : 상황에 따라 SOAP를 사용하도록 강요당하는 경우 (예 : 웹 서버가 SOAP를 사용하지만이를 제어하지 않은 경우)?
Bjarke Freund-Hansen

59

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

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


31

모바일 장치 (특히 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 이상인 경우에도 응답을 구문 분석 할 수 있습니다.


30

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


2
개발자가 REST API 대신 SOAP 서비스를 사용하도록 강요하는 사람들에게는 지옥에 특별한 장소가 있습니다.
Hitesh Sahu

24

약 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"를 인터넷 검색하는 동안이 스레드를 우연히 발견 한 일부 불쌍한 영혼이 그것을 가져다 줄 수 있다면 정말 좋겠습니다.


IceSoap에서 세션 인증 작업을 했습니까?
Adnen Chouibi

24

프로젝트에 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);
        }

    }
}

HttpTransportSE 어디서이 클래스를 얻을 수 있습니까 ??
노먼

안녕하세요, 코드를 사용하고 있지만 다음과 같은 오류가 발생합니다. 응답 :: AuthenticateTestResponse {AuthenticateTestResult = anyType {resultCode = Error; messages = anyType {MessagesTypeMessage = anyType {code = E00014; text = 판매자 인증이 필요합니다.; }; }; }; } 도와 줄수있으세요?
Hasmukh

안녕 Amit 메신저도 amit ..... 응답을 받았을 때 우리가 어떻게 응답하는지 비교할 수 있습니까? 응답을 확인할 조건과 조건은 무엇입니까?
Amitsharma

요청 속성의 XML에 배열을 추가하는 방법은 무엇입니까?
droidster.me

21

나는 KSOAP을 시도했다. 나는 더 간단한 접근법을 선택했다.

WSDL 파일이 주어지면 각 요청에 대해 SOAP 요청 템플리트를 작성하고 (예 : SOAP UI 사용) 코드로 전달할 값을 대체하십시오. DefaultHttpClient 인스턴스를 사용하여이 데이터를 서비스 엔드 포인트에 POST하고 응답 스트림을 가져 오십시오. XML 풀 구문 분석기를 사용하여 응답 스트림을 구문 분석하십시오.


18

WSClient ++를 볼 수 있습니다


4
kSoap 또는 SAX를 반복 한 후의 첫 번째 유용한 답변
rustyx

데모 버전을 사용해 보았습니다. 간단한 서비스를 위해 나를 위해 일하지 않았습니다. 많은 $$$$$를 쓸 가치가 없습니다.
Tushar

16

Android 플랫폼을위한 새 SOAP 클라이언트를 만들었습니다. JAX-WS 생성 인터페이스를 사용하고 있지만 지금까지는 개념 증명 일뿐입니다.

관심이 있으시면 AndroidSOAP 에서 예제를 보거나 소스를보십시오 .


1
JUM XVII에서 프레젠테이션에 참석하게되어 기뻤습니다. 이 안드로이드 물건에 대한 부다페스트. 좋은 일을 계속하십시오!
pcjuzer

15

가능하면 JSON으로 이동하십시오. 안드로이드는 완전한 org.json 패키지와 함께 제공됩니다


14

ksoap2 메소드를 호출 하십시오 . 아주 잘 작동합니다.

세부 사항을 다음과 같이 설정하십시오.

private static String mNAMESPACE=null;
private static String mURL=null;
public static Context context=null;
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(Request);

envelope.addMapping(mNAMESPACE, "UserCredentials",new UserCredendtials().getClass());
AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(mURL);

그런 다음 결과를 얻으려면

androidHttpTransport.call(SOAP_ACTION, envelope);
result = (SoapPrimitive)envelope.getResponse();


11

몇 달 전에 j2ee 응용 프로그램에서 jax-ws 웹 서비스로 작업하고있었습니다. CXF wsdl2java 를 사용 하여 WSDL 파일에서 WS 클라이언트 스텁을 생성했으며 해당 클라이언트 스텁으로 웹 서비스를 소비했습니다. 몇 주 전에 안드로이드 플랫폼에서 웹 서비스를 같은 방식으로 사용하려고 할 때 할 수 없었습니다. 왜냐하면 안드로이드 jar에는 클래스를 지원하는 모든 "jax-ws"가 없기 때문입니다. 그때 나는 내 요구 사항을 충족시키는 그러한 도구를 찾지 못했습니다 (Google에 효율적으로 실패하지 않은 경우).

  • WSDL에서 클라이언트 스텁을 가져 오십시오.
  • 그리고 몇 가지 인수 (java 비즈니스 요청 객체)로 서비스를 호출하십시오.
  • 응답 비즈니스 오브젝트를 확보하십시오.

그래서 나는 내 자신의 안드로이드 SOAP 클라이언트 생성 도구를 개발했다 . 다음 단계를 수행해야하는 경우 :

  • WSDL Get WS Client Stub에서 프로젝트에 넣습니다.
  • 일부 서비스 "ComplexOperationService", 서비스 인스턴스화, 엔드 포인트 포트 가져 오기 및 서비스 메소드 호출 및 웹 서비스에서 응답 받기 :

예 :

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • WSDL에서 생성 된 서비스 클래스 / 요청 / 응답 클래스 또는 다른 클래스와 메소드는 신경 쓰지 않아도됩니다.
  • 물론 비누 동작 / 봉투 / 네임 스페이스 등을 알 필요는 없습니다. 개발자가 항상하는 것처럼 메소드를 호출하면됩니다.

Date를 다루는 방법을 알고 있습니까? Apache CXF는 Android에서 작성할 수없는 XMLGregorianCalendar로 변환합니다.
Martin Nuc



6

메소드 SOAP으로 다음 단계를 수행하십시오.

WSDL 파일에서

  • 각 요청에 대한 SOAP 요청 템플리트를 작성하십시오.

  • 그런 다음 코드로 전달할 값을 대체하십시오.

  • DefaultHttpClient 인스턴스를 사용하여이 데이터를 서비스 엔드 포인트에 POST하십시오.

  • 응답 스트림을 받고 마지막으로

  • XML 풀 구문 분석기를 사용하여 응답 스트림을 구문 분석하십시오.



6

나에게 가장 쉬운 방법은 좋은 도구를 사용하여 필요한 모든 클래스를 생성하는 것입니다. 개인적으로 나는이 사이트를 사용합니다 :

http://easywsdl.com/

매우 복잡한 웹 서비스를 지원하고 ksoap2를 사용합니다.


5

나는 많은 도움이되는 매우 유용한 도구를 확인하는 것이 좋습니다. 그 프로젝트를 돌보는 사람들도 매우 도움이되었습니다. www.wsdl2code.com/


5

안드로이드에서 웹 서비스를 호출하는 데 문제가 있다면 아래 코드를 사용하여 웹 서비스를 호출하고 응답을 얻을 수 있습니다. 웹 서비스가 Data Table Format으로 응답을 반환하는지 확인하십시오.이 코드는 SQL Server 데이터베이스의 데이터를 사용하는 경우 도움이됩니다 . 당신이 사용하는 경우 MYSQL을 그냥 단어를 대체 한 가지를 변경해야 NewDataSet를 문장에서 obj2=(SoapObject) obj1.getProperty("NewDataSet");에 의해 DocumentElement

void callWebService(){ 

private static final String NAMESPACE = "http://tempuri.org/"; // for wsdl it may be package name i.e http://package_name
private static final String URL = "http://localhost/sample/services/MyService?wsdl";
// you can use IP address instead of localhost
private static final String METHOD_NAME = "Function_Name";
private static final String SOAP_ACTION = "urn:" + METHOD_NAME;

    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    request.addProperty("parm_name", prm_value);// Parameter for Method
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.dotNet = true;// **If your Webservice in .net otherwise remove it**
    envelope.setOutputSoapObject(request);
    HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);

    try {
        androidHttpTransport.call(SOAP_ACTION, envelope);// call the eb service
                                                                                                         // Method
    } catch (Exception e) {
        e.printStackTrace();
    }

    // Next task is to get Response and format that response
    SoapObject obj, obj1, obj2, obj3;
    obj = (SoapObject) envelope.getResponse();
    obj1 = (SoapObject) obj.getProperty("diffgram");
    obj2 = (SoapObject) obj1.getProperty("NewDataSet");

    for (int i = 0; i < obj2.getPropertyCount(); i++) { 
// the method getPropertyCount() and  return the number of rows
            obj3 = (SoapObject) obj2.getProperty(i);
            obj3.getProperty(0).toString();// value of column 1
            obj3.getProperty(1).toString();// value of column 2
            // like that you will get value from each column
        }
    }

이와 관련하여 문제가 있으면 저를 쓸 수 있습니다 ..


4

프로젝트와 함께 SOAP 라이브러리 파일을 다운로드하여 추가하십시오 파일 이름 : ksoap2-android-assembly-3.4.0-jar-with-dependencies

응용 프로그램을 청소하고 프로그램을 시작하십시오

SOAP 서비스 호출 코드는 다음과 같습니다.

    String SOAP_ACTION = "YOUR_ACTION_NAME";
    String METHOD_NAME = "YOUR_METHOD_NAME";
    String NAMESPACE = "YOUR_NAME_SPACE";
    String URL = "YOUR_URL";
    SoapPrimitive resultString = null;

    try {
        SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME);
        addPropertyForSOAP(Request);

        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        soapEnvelope.dotNet = true;
        soapEnvelope.setOutputSoapObject(Request);

        HttpTransportSE transport = new HttpTransportSE(URL);

        transport.call(SOAP_ACTION, soapEnvelope);
        resultString = (SoapPrimitive) soapEnvelope.getResponse();

        Log.i("SOAP Result", "Result Celsius: " + resultString);
    } catch (Exception ex) {
        Log.e("SOAP Result", "Error: " + ex.getMessage());
    }
    if(resultString != null) {
        return resultString.toString();
    }
    else{
        return "error";
    }

결과는 JSONObject 또는 JSONArray 또는 String 일 수 있습니다.

더 나은 참조를 위해 https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/

감사.


3

이것은 안드로이드에서 SOAP 웹 서비스를 사용하는 실제 예입니다.

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

public final String WSDL_TARGET_NAMESPACE = "http://tempuri.org/";
public final String METHOD_NAME = "FahrenheitToCelsius";
public final String PROPERTY_NAME = "Fahrenheit";
public final String SOAP_ACTION = "http://tempuri.org/FahrenheitToCelsius";
public final String SOAP_ADDRESS = "http://www.w3schools.com/webservices/tempconvert.asmx";


private class TestAsynk extends AsyncTask<String, Void, String> {

    @Override
    protected void onPostExecute(String result) {

        super.onPostExecute(result);
        Toast.makeText(getApplicationContext(),
                String.format("%.2f", Float.parseFloat(result)),
                Toast.LENGTH_SHORT).show();
    }

    @Override
    protected String doInBackground(String... params) {
        SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
                METHOD_NAME);
        request.addProperty(PROPERTY_NAME, params[0]);

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.dotNet = true;

        envelope.setOutputSoapObject(request);

        HttpTransportSE androidHttpTransport = new HttpTransportSE(
                SOAP_ADDRESS);
        Object response = null;
        try {

            androidHttpTransport.call(SOAP_ACTION, envelope);
            response = envelope.getResponse();
            Log.e("Object response", response.toString());

        } catch (Exception e) {
            e.printStackTrace();
        }
        return response.toString();
    }
}


3

특정 헤더를 사용하여 http를 통한 게시로 SOAP 호출을 수행 할 수 있습니다. ksoap2와 같은 추가 라이브러리 없이이 질문을 해결했습니다. 비누 서비스에서 주문을받는 라이브 코드는 다음과 같습니다.

private static HashMap<String,String> mHeaders = new HashMap<>();

static {
    mHeaders.put("Accept-Encoding","gzip,deflate");
    mHeaders.put("Content-Type", "application/soap+xml");
    mHeaders.put("Host", "35.15.85.55:8080");
    mHeaders.put("Connection", "Keep-Alive");
    mHeaders.put("User-Agent","AndroidApp");
    mHeaders.put("Authorization","Basic Q2xpZW50NTkzMzppMjR3s2U="); // optional
}public final static InputStream receiveCurrentShipments(String stringUrlShipments)
{
    int status=0;
    String xmlstring= "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:ser=\"http://35.15.85.55:8080/ServiceTransfer\">\n" +
            "   <soap:Header/>\n" +
            "   <soap:Body>\n" +
            "      <ser:GetAllOrdersOfShipment>\n" +
            "         <ser:CodeOfBranch></ser:CodeOfBranch>\n" +
            "      </ser:GetAllOrdersOfShipment>\n" +
            "   </soap:Body>\n" +
            "</soap:Envelope>";
    StringBuffer chaine = new StringBuffer("");

    HttpURLConnection connection = null;
    try {
        URL url = new URL(stringUrlShipments);
        connection = (HttpURLConnection) url.openConnection();
        connection.setRequestProperty("Content-Length", xmlstring.getBytes().length + "");
        connection.setRequestProperty("SOAPAction", "http://35.15.85.55:8080/ServiceTransfer/GetAllOrdersOfShipment");

        for(Map.Entry<String, String> entry : mHeaders.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            connection.setRequestProperty(key,value);

        }

        connection.setRequestMethod("POST");
        connection.setDoInput(true);

        OutputStream outputStream = connection.getOutputStream();
        outputStream.write(xmlstring.getBytes("UTF-8"));
        outputStream.close();

        connection.connect();
        status = connection.getResponseCode();
    } catch (ProtocolException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {

        Log.i("HTTP Client", "HTTP status code : " + status);
    }

    InputStream inputStream = null;
    try {
        inputStream = connection.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return inputStream;
}


이것에 대한 두 가지 질문 : 1. 어떻게 이것이 주요 활동에서 호출됩니까? 2. 매개 변수로 전달 된 StringUrlShipment의 값은 무엇입니까?
Tori

위의 의견에서 질문 1을 무시하십시오.
Tori

주요 활동에서 AsyncTask를 사용하여이 코드를 호출해야합니다. 이 AsyncTask를 클래스 내부에서이 코드를 실행 doInBackground를 구현
Lapenkov 블라디미르

2

android에서 SOAP 웹 서비스를 호출하려면이 클라이언트를 사용해보십시오.

Java 빌드 경로에 ksoap2-android.jar를 추가하는 것을 잊지 마십시오

public class WsClient {
    private static final String SOAP_ACTION = "somme";
    private static final String OPERATION_NAME = "somme";
    private static final String WSDL_TARGET_NAMESPACE = "http://example.ws";
    private static final String SOAP_ADDRESS = "http://192.168.1.2:8080/axis2/services/Calculatrice?wsdl";

    public String caclculerSomme() {

        String res = null;
        SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,
                OPERATION_NAME);
        request.addProperty("a", "5");
        request.addProperty("b", "2");

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);
        HttpTransportSE httpTransport = new HttpTransportSE(SOAP_ADDRESS);

        try {
            httpTransport.call(SOAP_ACTION, envelope);
            String result = envelope.getResponse().toString();
            res = result;
            System.out.println("############# resull is :" + result);
        } catch (Exception exception) {
            System.out.println("########### ERRER" + exception.getMessage());
        }

        return res;
    }
}

@ Wajdi hh 제공자의 응답 결과에서 응답 해상도를 비교하는 방법 :-성공 ..... "응답 = 1 ~ 성공"... ..
Amitsharma

1

비누 리바 레이 추가 ( ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar) :

공개 정적 문자열 Fn_Confirm_CollectMoney_Approval (

        HashMap < String, String > str1,
        HashMap < String, String > str2,
        HashMap < String, String > str3) {

    Object response = null;
    String METHOD_NAME = "CollectMoney";
    String NAMESPACE = "http://xxx/yyy/xxx";
    String URL = "http://www.w3schools.com/webservices/tempconvert.asmx";
    String SOAP_ACTION = "";

    try {

        SoapObject RequestParent = new SoapObject(NAMESPACE, METHOD_NAME);

        SoapObject Request1 = new SoapObject(NAMESPACE, "req");

        PropertyInfo pi = new PropertyInfo();

        Set mapSet1 = (Set) str1.entrySet();

        Iterator mapIterator1 = mapSet1.iterator();

        while (mapIterator1.hasNext()) {

            Map.Entry mapEntry = (Map.Entry) mapIterator1.next();

            String keyValue = (String) mapEntry.getKey();

            String value = (String) mapEntry.getValue();

            pi = new PropertyInfo();

            pi.setNamespace("java:com.xxx");

            pi.setName(keyValue);

            pi.setValue(value);

            Request1.addProperty(pi);
        }

        mapSet1 = (Set) str3.entrySet();

        mapIterator1 = mapSet1.iterator();

        while (mapIterator1.hasNext()) {

            Map.Entry mapEntry = (Map.Entry) mapIterator1.next();

            // getKey Method of HashMap access a key of map
            String keyValue = (String) mapEntry.getKey();

            // getValue method returns corresponding key's value
            String value = (String) mapEntry.getValue();

            pi = new PropertyInfo();

            pi.setNamespace("java:com.xxx");

            pi.setName(keyValue);

            pi.setValue(value);

            Request1.addProperty(pi);
        }

        SoapObject HeaderRequest = new SoapObject(NAMESPACE, "XXX");

        Set mapSet = (Set) str2.entrySet();

        Iterator mapIterator = mapSet.iterator();

        while (mapIterator.hasNext()) {

            Map.Entry mapEntry = (Map.Entry) mapIterator.next();

            // getKey Method of HashMap access a key of map
            String keyValue = (String) mapEntry.getKey();

            // getValue method returns corresponding key's value
            String value = (String) mapEntry.getValue();

            pi = new PropertyInfo();

            pi.setNamespace("java:com.xxx");

            pi.setName(keyValue);

            pi.setValue(value);

            HeaderRequest.addProperty(pi);
        }

        Request1.addSoapObject(HeaderRequest);

        RequestParent.addSoapObject(Request1);

        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER10);

        soapEnvelope.dotNet = false;

        soapEnvelope.setOutputSoapObject(RequestParent);

        HttpTransportSE transport = new HttpTransportSE(URL, 120000);

        transport.debug = true;

        transport.call(SOAP_ACTION, soapEnvelope);

        response = (Object) soapEnvelope.getResponse();

        int cols = ((SoapObject) response).getPropertyCount();

        Object objectResponse = (Object) ((SoapObject) response)
                .getProperty("Resp");

        SoapObject subObject_Resp = (SoapObject) objectResponse;


        modelObject = new ResposeXmlModel();

        String MsgId = subObject_Resp.getProperty("MsgId").toString();


        modelObject.setMsgId(MsgId);

        String OrgId = subObject_Resp.getProperty("OrgId").toString();


        modelObject.setOrgId(OrgId);

        String ResCode = subObject_Resp.getProperty("ResCode").toString();


        modelObject.setResCode(ResCode);

        String ResDesc = subObject_Resp.getProperty("ResDesc").toString();


        modelObject.setResDesc(ResDesc);

        String TimeStamp = subObject_Resp.getProperty("TimeStamp")
                .toString();


        modelObject.setTimestamp(ResDesc);

        return response.toString();

    } catch (Exception ex) {

        ex.printStackTrace();

        return null;
    }

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.