Как вызвать веб-службу SOAP на Android

У меня много проблем с поиском хорошей информации о том, как вызвать стандартную веб-службу SOAP / WSDL с Android. Все, что мне удалось найти, - это либо очень запутанные документы и ссылки на «kSoap2», либо немного о разборе всего этого вручную с помощью SAX. Хорошо, это нормально, но сейчас 2008 год, поэтому я подумал, что должна быть хорошая библиотека для вызова стандартных веб-сервисов.

Веб-сервис - это просто сервис, созданный в NetBeans. Я хотел бы иметь поддержку IDE для создания классов сантехники. Мне просто нужен самый простой / самый элегантный способ связаться с веб-службой на основе WSDL с телефона на базе Android.

Если кто-то ранее был знаком с MS VS, использование Mono для Android решит многие проблемы со службами данных и веб-службами, все просто и быстро. Также, кто не знаком с C# (код очень похож на Java), вся библиотека имеет одни и те же методы, некоторые функции заменены на свойства, поэтому имена почти такие же, и те, кто писал раньше на Java для Android, могут очень легко использовать свой опыт для написания C# код.

Eugene Bosikov 14.02.2013 21:42

Вот очень хорошая ссылка на использование SOAP в android: Как вызвать веб-службу в Android с помощью SOAP

Jainendra 16.01.2013 21:52

Взгляните на приведенную ниже ссылку, в которой есть подробный пример доступа к веб-сервису в Android с использованием Ksoap2 Доступ к веб-сервису с Android

Fred Ondieki 31.12.2013 13:54

Я считаю, что это возможно с Xamarin / C# с использованием .Net Core. см. blogs.msdn.microsoft.com/webdev/2016/05/25/…

Vahid Amiri 18.06.2016 21:13

инструмент от Spring выглядит многообещающе.

Louis 23.08.2017 15:24
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
559
5
425 517
26
Перейти к ответу Данный вопрос помечен как решенный

Ответы 26

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

Это сработало бы, только если бы ось была совместима с Android. Это не так (что-то о пакетах javax. * В зависимостях оси).

PaulProgrammer 17.12.2013 23:49
Ответ принят как подходящий

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

На сегодняшний день Google не проявляет особого интереса к добавлению библиотеки SOAP в Android. Я подозреваю, что они предпочли бы поддерживать текущие тенденции в веб-службах в сторону служб на основе REST и использовать JSON в качестве формата инкапсуляции данных. Или, используя XMPP для обмена сообщениями. Но это всего лишь предположение.

В настоящее время веб-службы на основе XML - это несколько нетривиальная задача для Android. Не зная NetBeans, я не могу говорить о доступных там инструментах, но я согласен с тем, что должна быть доступна лучшая библиотека. Возможно, XmlPullParser избавит вас от использования SAX, но я мало что знаю об этом.

Да, думаю, мне придется создать REST-прокси. Кажется довольно странным, что Google не заинтересован в поддержке SOAP. Пробовал метод kSoap, действительно даже серьезной альтернативы нет. Это, в лучшем случае, уродливая привычка, требующая тщательного изучения групп новостей.

BobbyShaftoe 22.11.2008 05:27

Причина, вероятно, в том, что протокол SOAP очень подробный и плохо справляется с ограничениями мобильных вычислений.

Neil 27.11.2009 00:46

Этот ответ был бы улучшен, если бы кто-то мог предложить лучшую альтернативу вызывать веб-службы с помощью приложения для Android. Как только люди найдут этот вопрос и прочитают его, большинство из них будет искать именно это.

MGOwen 22.12.2009 06:55

Обработка SOAP также требует больших затрат памяти и процессора по сравнению с более сжатым форматом, таким как JSON.

Jeremy Edwards 02.03.2010 09:15

@MGOwen Лучшая альтернатива, которую я вижу, - это прокси. Реализуйте интерфейс REST-ful, который проксирует конверты SOAP через WSDL2Java.

user4903 15.07.2011 21:57

@MGOwen, пожалуйста, проверьте мой ответ, в настоящее время это лучшая и единственная альтернатива, поскольку клиенты получают поддержку в отношении уплаченных лицензионных сборов.

Akash Kava 09.09.2011 13:09

Библиотека KSoap не может управлять огромным запросом или ответом. Все данные загружаются в память, поэтому может произойти сбой приложения и возникновение исключения OutOfMemory.

kinghomer 04.10.2012 17:26

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

Да, это был бы маршрут, по которому мне пришлось бы все разбирать вручную, я бы не получил объектно-ориентированного подхода.

BobbyShaftoe 09.01.2009 02:59

Вы имеете в виду, что не получите бесплатный обед. Ручной синтаксический анализ не имеет ничего общего с объектно-ориентированным программированием. Я мог бы анализировать все на бумаге с помощью моего самого продвинутого инструмента - карандаша HB1, и это все равно было бы OO.

Neil 19.01.2009 00:01

Я считаю, что под OO автор имел в виду привязку Java-XML. Каким будет ваш следующий шаг в этом подходе к синтаксическому анализу ответа? А если в нем сотни элементов, организованных в древовидную структуру?

rustyx 07.07.2011 18:26

Кстати, я бы ожидал по крайней мере HTTP POST, а не GET, если вы хотите, чтобы вам повезло с SOAP. Кроме того, где заголовки Accept и SOAPAction? Если вы действительно хотите стать коммандосом, для использования службы SOAP потребуется гораздо больше, чем эти 4 строки.

rustyx 07.07.2011 18:31

Если бы у меня были мои помощники, я бы не стал использовать SOAP для веб-служб для начала. Я бы пошел RESTful с XML или еще лучше JSON. Вы пишете клиент на мобильное устройство. Вы действительно хотите использовать само устройство для синтаксического анализа WSDL, автоматического создания поддерживающих классов, а затем самого прокси еще до того, как сделать первый вызов веб-службы? Как часто вы собираетесь это делать? Что именно за приложение? О.о

Neil 07.07.2011 23:11

@NeilD: Что, если бы обстоятельства заставили вас использовать протокол SOAP, например веб-сервер использует протокол SOAP, и вы не можете это контролировать?

Bjarke Freund-Hansen 02.02.2012 18:33

@bjarkef: kSOAP 2 кажется популярным выбором, согласно ответу выше. Хотя в использовании SOAP без него нет ничего изначально неуправляемого, это просто больше работы. Вы также можете написать прокси-сервер и отделить рассматриваемую веб-службу SOAP от вашего мобильного клиента, но это может оказаться гораздо более сложной задачей, чем простое внедрение kSOAP или другой подобной библиотеки.

Neil 07.02.2012 00:02

Да, это не совсем ответ на вопрос ОП. Оказалось, что это полезно для меня (в моем случае меня даже не особо волнует ответ SOAP, мне просто нужно убедиться, что служба работает; поэтому, хотя это и разочаровывает, нет встроенной библиотеки SOAP, освежить в памяти, как сделать базовый POST в Android, удобно), но на самом деле это не отвечает на вопрос это.

user435779 06.12.2013 23:34

Есть ли способ отправить заголовки XML без использования ksoap?

Sneha Sarkar 13.06.2018 16:13

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

В аду есть особое место для тех, кто заставляет разработчиков использовать сервисы SOAP вместо REST API.

Hitesh Sahu 26.08.2017 07:56

Это правда, что из-за накладных расходов SOAP - не лучший выбор для обмена данными с мобильными устройствами. Однако вы можете оказаться в ситуации, когда вы не контролируете формат вывода сервера.

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

У меня было свидание с KSOAP; Я выбрал более простой подход.

Учитывая файл WSDL, создайте шаблоны запросов SOAP для каждого запроса (например, с использованием пользовательского интерфейса SOAP), а затем замените значения, которые будут переданы в коде. Отправьте эти данные в конечную точку службы, используя экземпляр DefaultHttpClient, и получите поток ответа. Разберите поток ответа с помощью синтаксического анализатора XML Pull.

Если можете, выберите JSON. Android поставляется с полным пакетом org.json

Чтобы вызвать веб-службу с мобильного устройства (особенно на телефоне Android), я использовал очень простой способ сделать это. Я не использовал API-интерфейс клиента веб-службы при попытке вызвать веб-службу. Мой подход к звонку следующий.

  1. Создайте простое HTTP-соединение с помощью с использованием стандартного API Java HttpURLConnection.
  2. Сформируйте запрос SOAP. (Ты можешь сделать помощь SOAPUI в создании SOAP запрос.)
  3. Установите флаг doOutPut как true.
  4. Установите значения заголовка HTTP, например content-length, Content type и User-agent. Не забудь чтобы установить значение Content-length, так как это обязательно.
  5. Запишите весь запрос SOAP в выходной поток.
  6. Вызовите метод, чтобы установить соединение и получить ответ (в моем случае я использовал getResonseCode).
  7. Если вы получили код ответа как
    1. Значит, вам удалось вызвать веб-сервис.
  8. Теперь возьмем входной поток на том же HTTP-соединение и получите строковый объект. Этот строковый объект ответ SOAP.
  9. Если код ответа отличается от 200, затем возьмите поток ErrorInput на тот же объект HTTP и получите ошибка, если есть.
  10. Разобрать полученный ответ используя SAXParser (в моем случае) или DOMParaser или любой другой парсинг механизм.

Я реализовал эту процедуру для телефона Android, и она успешно работает. Я могу разобрать ответ, даже если он превышает 700 KB.

Надеюсь, Вызов веб-службы с Android поможет.

Вы можете посмотреть WSClient ++

Наконец, первый полезный ответ после повторения kSoap или SAX

rustyx 07.07.2011 18:20

Пробовал демо-версию. У меня не получилось на простую услугу. Не стоит тратить так много $$$$$.

Tushar 26.07.2011 23:10

Я создал новый клиент SOAP для платформы Android. Он использует сгенерированный JAX-WS интерфейс, но пока это только проверка концепции.

Если вам интересно, попробуйте этот пример и / или посмотрите источник на AndroidSOAP.

Я имел удовольствие присутствовать на вашей презентации на JUM XVII. Будапешт об Android. Продолжайте хорошую работу!

pcjuzer 19.11.2010 12:58

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

Если вы можете использовать JSON, в Разработка сервисов приложений с помощью серверов PHP и телефонных клиентов Android есть технический документ, видео и sample.code.

Вызвать методы 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();

Около года назад я читал эту ветку, пытаясь понять, как выполнять вызовы 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", могли бы попробовать и получить некоторую выгоду.

вы работали с аутентификацией сеанса на Ice Soap?

Adnen Chouibi 24.12.2016 19:05

Несколько месяцев назад я работал с веб-сервисом jax-ws в приложении j2ee. Там мы использовали CXF wsdl2java для создания заглушки клиента WS из файла WSDL, и с этими заглушками клиента мы использовали веб-сервисы. Несколько недель назад, когда я пытался использовать веб-службу таким же образом на платформе Android, я не мог, потому что в банке Android не все поддерживающие классы jax-ws. В тот раз я не нашел ни одного такого инструмента (если бы мне не удалось эффективно гуглить), чтобы удовлетворить мои требования -

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

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

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

например:

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 / и т. д. Просто вызывайте метод, как мы, разработчики, все время делаем.

Вы знаете, как бороться с Дата? Apache CXF переводит его в XMLGregorianCalendar, который я не могу создать в Android.

Martin Nuc 13.04.2013 19:45

Если у вас возникла проблема с вызовом веб-службы в 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
        }
    }

Если у вас возникнут проблемы по этому поводу, напишите мне.

Выполните эти шаги с помощью метода SOAP.

Из файла WSDL

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

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

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

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

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

Чтобы вызвать веб-службу 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;
    }
}

@ Wajdi hh, как сравнить результат ответа с результатом ответа дающего: - успех ..... "response = 1 ~ Successfull" .... итак, как мы сравниваем этот результат с условиями, которые получены на стороне сервера ...... ..

Amitsharma 14.08.2014 15:43

DON'T FORGET TO ADD ksoap2.jar in your project and also add the INTERNET permission in AndroidManifest file

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 где взять этот класс ??

Noman 23.11.2012 10:40

Здравствуйте, я использую ваш код, но получаю следующую ошибку: Response :: AuthenticateTestResponse {AuthenticateTestResult = an‌ yType {resultCode = Err‌ или; messages = anyType {MessagesTypeMessage = anyType {code = E00014; text = Требуется аутентификация продавца .; }; }; }; } не могли бы вы мне помочь, пожалуйста?

Hasmukh 10.07.2013 14:56

привет, Амит, я тоже амит ..... Можете ли вы сказать мне, как мы сравниваем реакцию, когда мы получили ответ, успешный или нет, так как и при каких условиях проверить ответ ......

Amitsharma 14.08.2014 15:40

как добавить массив в xml свойства запроса?

droidster.me 09.12.2016 09:59

Я бы посоветовал попробовать очень полезный инструмент, который мне очень помог. Парни люди, которые занимались этим проектом, тоже очень помогли. www.wsdl2code.com/

Это рабочий пример использования веб-сервисов 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();
    }
}

пожалуйста, помогите мне в этом вопросе stackoverflow.com/questions/41573829/…

Edijae Crusar 10.01.2017 21:41

Для меня самый простой способ - использовать хороший инструмент для создания всех необходимых классов. Лично я пользуюсь этим сайтом:

http://easywsdl.com/

Он поддерживает довольно сложные веб-службы и использует ksoap2.

Загрузите и добавьте файл библиотеки SOAP в свой проект. Имя файла: ksoap2-android-assembly-3.4.0-jar-с зависимостями

Очистите приложение, а затем запустите программу

Вот код для вызова службы 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/

Спасибо.

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

}

Вы можете выполнять мыльный вызов как сообщение через 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;
}

помогите пожалуйста здесь stackoverflow.com/questions/41573829/…

Edijae Crusar 10.01.2017 21:35

два вопроса по этому поводу: 1. Как это вызывается из основного действия? 2. Каким должно быть значение StringUrlShipment, передаваемого в качестве параметра?

Tori 22.02.2017 11:55

к приведенному выше комментарию не обращайте внимания на вопрос №1.

Tori 22.02.2017 12:02

Из основного действия вы должны использовать AsyncTask для вызова этого кода. Внутри этого класса AsyncTask реализуйте doInBackground для запуска этого кода.

Lapenkov Vladimir 22.09.2017 11:21

Другие вопросы по теме