Как да се обадя на SOAP уеб услуга на Android [затворено]

Имам много проблеми с намирането на добра информация за това как да извикам стандартна SOAP/WSDL уеб услуга с Android. Всичко, което успях да намеря, са или много сложни документи и препратки към "kSoap2" и след това малко за ръчния анализ на всичко това с SAX. Добре, това е добре, но е 2008 г., така че реших, че трябва да има добра библиотека за извикване на стандартни уеб услуги.

Уеб услугата е просто създадена в NetBeans. Бих искал да имам IDE поддръжка за генериране на водопроводни класове. Просто имам нужда от най-лесния/най-елегантния начин да се свържа с WSDL базирана уеб услуга от Android- базиран телефон.


person BobbyShaftoe    schedule 18.11.2008    source източник
comment
Ето много добра връзка за използване на SOAP в android: Как да се обадите на уеб услуга в Android чрез SOAP   -  person Jainendra    schedule 16.01.2013
comment
Ако някой вече е запознат с MS VS, използването на Mono за Android ще реши много проблеми с услугите за данни и уеб услугите, всичко е просто и бързо разработка. Освен това, който не е запознат с C# (код, много подобен на Java), всички библиотеки имат едни и същи методи, някои функции са заменени в свойствата, така че имената са почти същите и тези, които са писали преди на Java за android, могат много лесно, използвайки своя опит, да напишат c# код.   -  person Eugene Bosikov    schedule 14.02.2013
comment
Разгледайте връзката по-долу, тя съдържа подробен пример за достъп до уеб услуга в Android чрез Ksoap2 Достъп до уеб услуга от Android   -  person Fred Ondieki    schedule 31.12.2013
comment
Вярвам, че това е възможно с Xamarin/C#, използвайки .Net Core. вижте blogs.msdn.microsoft.com/webdev/2016/05/25/   -  person Vahid Amiri    schedule 18.06.2016
comment
Този инструмент от Spring изглежда обещаващо.   -  person Louis    schedule 23.08.2017


Отговори (26)


Android не предоставя никаква SOAP библиотека. Можете или да напишете свой собствен, или да използвате нещо като kSOAP 2. Както забелязвате, други успяха да компилират и използват kSOAP2 в собствените си проекти, но на мен не ми се е налагало.

Към днешна дата Google показва малък интерес към добавянето на SOAP библиотека към Android. Подозрението ми за това е, че те предпочитат да подкрепят текущите тенденции в уеб услугите към услуги, базирани на REST, и да използват JSON като формат за капсулиране на данни. Или използване на XMPP за съобщения. Но това е само предположение.

Базираните на XML уеб услуги са малко нетривиална задача за Android в момента. Като не познавам NetBeans, не мога да говоря за наличните там инструменти, но съм съгласен, че трябва да има по-добра библиотека. Възможно е XmlPullParser да ви спаси от използването на SAX, но не знам много за това.

person foxxtrot    schedule 19.11.2008
comment
Да, мисля, че ще трябва да създам REST прокси. Изглежда доста странно, че Google няма интерес да предоставя SOAP поддръжка. Пробвах метода kSoap, наистина дори не е сериозна алтернатива. В най-добрия случай това е грозна ситуация, която изисква много претърсване на дискусионните групи. - person BobbyShaftoe; 22.11.2008
comment
Причината вероятно е, че SOAP е много подробен и не обслужва добре ограниченията на мобилните компютри. - person Neil; 27.11.2009
comment
Този отговор ще бъде подобрен, ако някой предложи най-добрата алтернатива за извикване на уеб услуги с приложение за Android. След като хората намерят този въпрос и го прочетат, това е, което повечето от тях ще търсят. - person MGOwen; 22.12.2009
comment
SOAP обработката също изисква памет и процесор в сравнение с по-сбит формат като JSON. - person Jeremy Edwards; 02.03.2010
comment
@MGOwen Най-добрата алтернатива, която виждам, е прокси. Внедрете REST-ful интерфейс, който проксира SOAP пликовете през WSDL2Java. - person ; 15.07.2011
comment
@MGOwen, моля, проверете моя отговор, в момента това е най-добрата и единствена алтернатива, тъй като клиентите получават поддръжка за платените лицензни такси. - person Akash Kava; 09.09.2011
comment
Библиотеката на KSoap не може да управлява огромна заявка или отговор. Всички данни се зареждат в паметта, така че може да се случи приложението да се срине и да възникне изключение OutOfMemory. - person kinghomer; 04.10.2012

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);
person Neil    schedule 08.01.2009
comment
Да, това би бил маршрутът, при който ще трябва ръчно да анализирам всичко, няма да получа обектно-ориентиран подход. - person BobbyShaftoe; 09.01.2009
comment
Искаш да кажеш, че няма да получиш безплатен обяд. Ръчното анализиране няма нищо общо с OO. Бих могъл да анализирам всичко на хартия с най-модерния ми инструмент, който беше молив HB1, и пак щеше да е OO. - person Neil; 19.01.2009
comment
Вярвам, че под OO авторът е имал предвид обвързване на Java-XML. Каква ще бъде следващата ви стъпка в този подход за анализиране на отговора? И ако има стотици елементи, организирани в дървовидна структура? - person rustyx; 07.07.2011
comment
Между другото, бих очаквал поне HTTP POST, а не GET, ако искате да имате късмет със SOAP. Също така, къде са заглавките Accept и SOAPAction? Ако наистина искате да станете командос, ще са необходими много повече от тези 4 реда, за да използвате SOAP услуга. - person rustyx; 07.07.2011
comment
Ако имах моите приятели, не бих използвал SOAP за уеб услуга като начало. Бих преминал към RESTful с XML или още по-добре JSON. Вие пишете клиент на мобилно устройство. Наистина ли искате да използвате самото устройство, за да анализирате WSDL, автоматично да създадете поддържащите класове и след това самия прокси, преди дори да направите първото си извикване на уеб услуга? Колко често смятате да правите това? Какво точно е приложението? о.о - person Neil; 07.07.2011
comment
@NeilD: Ами ако сте били принудени от обстоятелствата да използвате SOAP, напр. уеб сървърът използва SOAP и вие нямате контрол върху това? - person Bjarke Freund-Hansen; 02.02.2012
comment
@bjarkef: kSOAP 2 изглежда е популярен избор, според отговора по-горе. Въпреки че няма нищо вродено неуправляемо в консумирането на SOAP без него, това е просто повече работа. Можете също така да напишете прокси сървър и да разделите въпросната SOAP уеб услуга и вашия мобилен клиент, но това може да се окаже много по-голяма задача от простото приемане на kSOAP или друга подобна библиотека. - person Neil; 07.02.2012
comment
Да, това всъщност не отговаря на въпроса на ОП. Оказа се полезно за мен (в моя случай дори не ме е грижа толкова много за SOAP отговора, просто трябва да се уверя, че услугата е жива; така че въпреки че е разочароващо, няма вградена SOAP библиотека, опресняване на това как да правите основен POST в Android е удобно), но всъщност не отговаря на този въпрос. - person user435779; 06.12.2013
comment
Има ли някакъв начин да изпратите XML заглавки, без да използвате ksoap? - person Sneha Sarkar; 13.06.2018

Вярно е, че поради режийните си разходи SOAP не е най-добрият избор за обмен на данни с мобилни устройства. Въпреки това може да се окажете в ситуация, в която не контролирате формата на изхода на сървъра.

Така че, ако трябва да се придържате към SOAP, тук има kSOAP2 библиотека, коригирана за Android:
http://code.google.com/p/ksoap2-android/

person Viktor Brešan    schedule 10.10.2009

За да извикам уеб услуга от мобилно устройство (особено на телефон с Android), използвах много прост начин да го направя. Не съм използвал API на клиент на уеб услуга в опит да извикам уеб услугата. Моят подход е следният за извършване на обаждане.

  1. Създайте проста HTTP връзка, като използвате стандартния API на Java HttpURLConnection.
  2. Формирайте SOAP заявка. (Можете да помогнете на SOAPUI, за да направите SOAP заявка.)
  3. Задайте флага doOutPut като true.
  4. Задайте стойности на HTTP заглавка като дължина на съдържанието, тип съдържание и потребителски агент. Не забравяйте да зададете стойност за дължина на съдържанието, тъй като тя е задължителна.
  5. Запишете цялата SOAP заявка в изходния поток.
  6. Извикайте метода, за да осъществите връзка и да получите отговор (В моя случай използвах getResonseCode).
  7. If your received response code as
    1. It means you are succeeded to call web service.
  8. Сега вземете входен поток на същата HTTP връзка и получете низовия обект. Този низов обект е SOAP отговор.
  9. Ако кодът на отговор е различен от 200, тогава вземете ErrorInput поток на същия HTTPобект и получете грешката, ако има такава.
  10. Анализирайте получения отговор с помощта на SAXParser (в моя случай) или DOMParaser или друг механизъм за анализ.

Приложих тази процедура за телефона с Android и тя работи успешно. Мога да анализирам отговора дори ако е повече от 700 KB.

person Priyanjan    schedule 04.02.2010

SOAP е неподходяща технология за използване на Android (или мобилни устройства като цяло) поради необходимостта от обработка/синтактичен анализ. REST услугите са по-леко решение и това е, което бих предложил. Android идва със SAX анализатор и е доста тривиален за използване. Ако сте абсолютно задължени да обработвате/разбирате SOAP на мобилно устройство, тогава съжалявам за вас, най-добрият съвет, който мога да предложа, е просто да не използвате SOAP.

person jasonhudgins    schedule 12.01.2009
comment
Има специално място в ада за онези, които принуждават разработчиците да използват SOAP услуги вместо REST API. - person Hitesh Sahu; 26.08.2017

Преди около година четох тази тема, опитвайки се да разбера как да правя SOAP повиквания на Android - предложенията да създам свои собствени с помощта на HttpClient доведоха до изграждането на моя собствена SOAP библиотека за Android:

IceSoap

По принцип ви позволява да създавате пликове за изпращане чрез прост Java API, след което автоматично ги анализира в обекти, които дефинирате чрез XPath... например:

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

става:

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

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

Използвах го за собствен проект, но реших, че може да помогне на други хора, така че прекарах известно време, за да го отделя и документирам. Наистина ще се радвам, ако някои от вашите нещастници, които случайно попаднат на тази тема, докато търсят в Google „SOAP Android“, могат да я пробват и да получат някаква полза.

person Alex Gilleran    schedule 29.01.2012
comment
работихте ли със сесийното удостоверяване на IceSoap? - person Adnen Chouibi; 24.12.2016

НЕ ЗАБРАВЯЙТЕ ДА ДОБАВИТЕ 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);
        }

    }
}
person Amit kumar    schedule 07.06.2012
comment
HttpTransportSE къде мога да взема този клас?? - person Noman; 23.11.2012
comment
Здравейте, използвам вашия код, но получавам следната грешка Response::AuthenticateTestResponse{AuthenticateTestResult=anyType{resultCode=Error; messages=anyType{MessagesTypeMessage=anyType{code=E00014; text=Изисква се удостоверяване на търговеца.; }; }; }; } можете ли да ми помогнете, моля? - person Hasmukh; 10.07.2013
comment
здравей Амит, аз също съм амит ..... Можете ли да ми кажете как отговорът сравняваме, когато получим отговор е успешен или не, така че как и при какви условия да проверя отговора ...... - person Amitsharma; 14.08.2014
comment
как да добавя масив в xml на свойството на заявката? - person droidster.me; 09.12.2016

Имах моя опит с KSOAP; Избрах доста по-прост подход.

При даден WSDL файл създайте шаблони за SOAP заявка за всяка заявка (напр.: използване на SOAP UI) и след това заменете стойностите, които да бъдат предадени в кода. ПУБЛИКУВАЙТЕ тези данни в крайната точка на услугата, като използвате екземпляр на DefaultHttpClient и вземете потока от отговори. Анализирайте потока от отговори с помощта на парсер за изтегляне на XML.

person Samuh    schedule 21.12.2009

Можете да разгледате WSClient++

person Akash Kava    schedule 15.07.2010
comment
Най-накрая първи полезен отговор след повторение на kSoap или SAX - person rustyx; 07.07.2011
comment
Пробвах демо версията. Не ми свърши работа за проста услуга. Не си струва да харчите толкова $$$$$. - person Tushar; 26.07.2011

Създадох нов SOAP клиент за платформата Android. Той използва интерфейс, генериран от JAX-WS, но засега е само доказателство за концепцията.

Ако се интересувате, моля, опитайте примера и/или гледайте източника на AndroidSOAP.

person Gábor AUTH    schedule 19.10.2010
comment
Имах удоволствието да присъствам на вашата презентация на JUM XVII. Будапеща за тези неща с Android. Продължавай с добрата работа! - person pcjuzer; 19.11.2010

Ако можете, изберете JSON. Android идва с пълния пакет org.json

person Yves    schedule 23.12.2009

Извикайте методите 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();
person DEVANG SHARMA    schedule 18.05.2011

Надявам се Извикването на уеб услуга от Android да помогне.

person Monte Chan    schedule 25.04.2010

Преди няколко месеца работих с уеб услугата jax-ws в j2ee приложение, там използвахме CXF wsdl2java за генериране на WS клиентски пън от WSDL файла и с тези клиентски пънове използвахме уеб услугите. Преди няколко седмици, когато се опитвах да използвам уеб услугата по същия начин в платформата android, не можах, защото android jar няма всички поддържащи класове "jax-ws" в него. По това време не намерих такъв инструмент (ако не успях да потърся ефективно в Google), който да отговаря на изискванията ми --

  • Вземете клиентския файл от WSDL.
  • И извикайте услугата с някакъв аргумент (обект на бизнес заявка на Java).
  • Вземете Response Business Object.

И така, разработих свой собствен инструмент за генериране на SOAP клиент за Android. Където трябва да изпълните следните стъпки:

  • От WSDL Вземете WS Client Stub, поставете го във вашия проект.
  • Кажете за някаква услуга „ComplexOperationService“, създайте екземпляр на услугата, вземете порта на крайната точка и извикайте метода на услугата и получете отговора от уеб услугата:

eg:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • Не е нужно да се интересувате от класовете на услугата/req/response или други класове и метода, тъй като знаете, че всички са генерирани от WSDL.
  • И, разбира се, не е нужно да сте наясно със сапуненото действие/обгръщане/именно пространство и т.н. Просто извикайте метода, както ние, разработчиците, правим през цялото време.
person Asraful Haque    schedule 10.05.2012
comment
Знаете ли как да се справите с Date? Apache CXF го превежда в XMLGregorianCalendar, който не мога да създам в Android. - person Martin Nuc; 13.04.2013

Сигурен съм, че можете да направите малък SOAP клиент с Axis. Инструкции за инсталиране на Axis.

person branchgabriel    schedule 18.11.2008
comment
Това ще работи само ако axis е съвместим с Android. Не е (нещо за javax.* пакети в зависимостите на оста). - person PaulProgrammer; 17.12.2013

Мисля, че Извикване на SOAP уеб услуга от приложение за Android ще ви помогне много.

person Srikanth Naidu    schedule 28.01.2011

Следвайте тези стъпки по метода SOAP

От WSDL файла,

  • създайте шаблони за SOAP заявка за всяка заявка.

  • След това заменете стойностите, които трябва да бъдат предадени в кода.

  • Публикувайте тези данни в крайната точка на услугата, като използвате екземпляр DefaultHttpClient.

  • Вземете потока от отговори и накрая

  • Анализирайте потока от отговори с помощта на парсер за изтегляне на XML.

person Manick    schedule 01.06.2012

Ако можете да използвате JSON, има бяла книга, видеоклип и sample.code в Разработване на услуги за приложения с PHP сървъри и клиенти за телефони с Android.

person Daniele Teti    schedule 24.04.2011

За мен най-лесният начин е да използвам добър инструмент за генериране на всички необходими класове. Лично аз използвам този сайт:

http://easywsdl.com/

Поддържа доста сложни уеб услуги и използва ksoap2.

person robocik    schedule 13.11.2013

Бих предложил да разгледате един много полезен инструмент, който ми помогна много. Момчетата, които се грижат за този проект, също бяха много полезни. www.wsdl2code.com/

person miroslavign    schedule 28.05.2013

Ако имате проблем с извикването на уеб услуга в android, можете да използвате кода по-долу, за да се обадите на уеб услугата и да получите отговор. Уверете се, че вашата уеб услуга връща отговора във формат на таблица с данни.. Този код ще ви помогне, ако използвате данни от база данни на 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
        }
    }

Ако имате някакъв проблем по този въпрос, можете да ми пишете..

person Sachin D    schedule 21.05.2012

Това е работещ пример за използване на SOAP уеб услуги в android.

**Забележка ::***НЕ ЗАБРАВЯЙТЕ ДА ДОБАВИТЕ 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();
    }
}
person Arun    schedule 30.07.2013
comment
моля, помогнете ми по този проблем stackoverflow.com/questions/41573829/ - person Edijae Crusar; 10.01.2017

Моля, изтеглете и добавете 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/

Благодаря.

person lokesh s    schedule 08.12.2015

Можете да извършите сапунено повикване като публикация през http с определени заглавки. Реших този въпрос без допълнителни библиотеки като ksoap2 Ето код на живо, който получава поръчки от soap service

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;
}
person Lapenkov Vladimir    schedule 19.08.2016
comment
моля, помогнете тук stackoverflow.com/questions/41573829/ - person Edijae Crusar; 10.01.2017
comment
два въпроса за това: 1. Как се извиква това от основна дейност? 2. Каква трябва да бъде стойността на StringUrlShipment, която се предава като параметър? - person Tori; 22.02.2017
comment
на горния коментар, игнорирайте въпрос #1. - person Tori; 22.02.2017
comment
От основната дейност трябва да използвате AsyncTask, за да извикате този код. Вътре в този клас AsyncTask имплементирайте doInBackground, за да стартирате този код - person Lapenkov Vladimir; 22.09.2017

За да извикате SOAP уеб услуга от android, опитайте да използвате този клиент

НЕ ЗАБРАВЯЙТЕ ДА ДОБАВИТЕ ksoap2-android.jar във вашия път за изграждане на Java

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;
    }
}
person Wajdi Hh    schedule 07.06.2012
comment
@ Wajdi hh как да сравним response на отговора от резултата на отговора на даващия :- успех .....отговор =1~Успешен.... така че как сравняваме този резултат с условие, което е от страната на сървъра ........ - person Amitsharma; 14.08.2014

Добавяне на сапун Libaray(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;
    }

}
person Mani    schedule 30.05.2016