Как вызвать веб-службу 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
Вы имеете в виду, что не получите бесплатный обед. Ручной синтаксический анализ не имеет ничего общего с объектно-ориентированным программированием. Я мог бы анализировать все на бумаге с помощью моего самого продвинутого инструмента, карандаша HB1, и это все равно было бы OO. - person Neil; 19.01.2009
comment
Я считаю, что под OO автор имел в виду привязку Java-XML. Каким будет ваш следующий шаг в этом подходе к синтаксическому анализу ответа? А если в нем сотни элементов, организованных в древовидную структуру? - person rustyx; 07.07.2011
comment
Кстати, я бы ожидал по крайней мере HTTP POST, а не GET, если вы хотите, чтобы вам повезло с SOAP. Кроме того, где заголовки Accept и SOAPAction? Если вы действительно хотите стать коммандосом, для использования службы SOAP потребуется гораздо больше, чем эти 4 строки. - 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, здесь есть исправленная для Android библиотека kSOAP2:
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, такие как длина содержимого, тип содержимого и пользовательский агент. Не забудьте установить значение Content-length, так как это обязательно.
  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 КБ.

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 в свой проект, а также добавить разрешение INTERNET в файл 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), а затем замените значения, которые будут переданы в коде. Отправьте эти данные в конечную точку службы, используя экземпляр DefaultHttpClient, и получите поток ответа. Разберите поток ответа с помощью синтаксического анализатора XML Pull.

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 не все поддерживающие классы "jax-ws". В тот раз я не нашел ни одного такого инструмента (если бы мне не удалось эффективно гуглить), чтобы удовлетворить мои требования -

  • Получите заглушку клиента из WSDL.
  • И вызовите Сервис с некоторым аргументом (объект бизнес-запроса java).
  • Получите бизнес-объект ответа.

Итак, я разработал свой собственный Android SOAP Client Generation Tool. Где вам нужно выполнить следующие действия:

  • Получите из WSDL заглушку клиента WS, поместите ее в свой проект.
  • Скажем для некоторых служб «ComplexOperationService», создайте экземпляр службы, получите порт конечной точки и вызовите метод службы и получите ответ от веб-службы:

eg:

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

Я уверен, что вы могли бы создать небольшой SOAP-клиент с помощью Axis. Инструкции по установке Axis.

person branchgabriel    schedule 18.11.2008
comment
Это сработало бы, только если бы ось была совместима с Android. Это не так (что-то о пакетах javax. * В зависимостях оси). - person PaulProgrammer; 17.12.2013

Я думаю, что Вызов веб-службы SOAP из приложения Android очень поможет вам.

person Srikanth Naidu    schedule 28.01.2011

Выполните следующие действия с помощью метода SOAP.

Из файла WSDL

  • создавать шаблоны запросов SOAP для каждого запроса.

  • Затем подставьте значения, которые нужно передать в коде.

  • Отправьте эти данные в конечную точку службы, используя экземпляр DefaultHttpClient.

  • Получите поток ответов и, наконец,

  • Разберите поток ответа с помощью синтаксического анализатора XML Pull.

person Manick    schedule 01.06.2012

Если вы можете использовать JSON, есть технический документ, видео и образец кода в Разработка сервисов приложений с помощью серверов 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 в свой проект, а также добавить разрешение INTERNET в файл 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 Вот живой код, получающий заказы от мыльной службы

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 ~ Successfull .... итак, как мы сравниваем этот результат с условиями, которые получены на стороне сервера ........ - person Amitsharma; 14.08.2014

Добавьте Soap 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