Как вызвать SOAP веб-сервис на Android [закрыто]

553

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

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

BobbyShaftoe
источник
Вот очень хорошая ссылка на использование SOAP в Android: Как
вызвать
Если кто-то, ранее знакомый с MS VS, с помощью Mono для Android решит много проблем со службами данных и веб-службами, все будет просто и быстро. Также, кто не знаком с C # (код очень похож на Java), все библиотеки имеют одинаковые методы, некоторые функции заменены на свойства, поэтому имена почти одинаковы, и те, кто писал ранее на Java для android, могут очень легко использовать свой опыт написания c # код.
Евгений Босиков
Посмотрите на приведенную ниже ссылку, в которой приведен подробный пример доступа к веб-сервису в Android с помощью Ksoap2 Доступ к веб-сервису из Android
Фред Ондики
Я считаю, что это возможно с Xamarin / C # с использованием .Net Core. см. blogs.msdn.microsoft.com/webdev/2016/05/25/…
Вахид Амири
Этот инструмент от Spring выглядит многообещающе.
Луи

Ответы:

245

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

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

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

foxxtrot
источник
7
Да, я думаю, мне придется создать REST-прокси. Кажется довольно странным, что Google не заинтересован в поддержке SOAP. Я попробовал метод kSoap, это действительно даже не серьезная альтернатива. Это, в лучшем случае, уродливое существо, требующее тщательного изучения групп новостей.
BobbyShaftoe
19
Причина, вероятно, в том, что SOAP очень многословен и плохо обслуживает ограничения мобильных вычислений.
Нил
92
Этот ответ был бы лучше, если бы кто-то мог предложить лучшую альтернативу вызову веб-сервисов с помощью приложения для Android. Как только люди найдут этот вопрос и прочитают его, именно это и будет искать большинство из них.
MGOwen
4
Обработка SOAP также требует значительных ресурсов памяти и процессора по сравнению с более кратким форматом, таким как JSON.
Джереми Эдвардс
3
@MGOwen Лучшая альтернатива - прокси. Реализуйте интерфейс REST-ful, обеспечивающий прокси-конверты SOAP через WSDL2Java.
99

org.apache.http.impl.client.DefaultHttpClientпоставляется в Android SDK по умолчанию. Это соединит вас с WSDL.

HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet = new HttpGet("http://www.example.com/" + URL);
HttpResponse response = httpClient.execute(httpGet, localContext);
Нил
источник
5
Да, это был бы маршрут, по которому мне пришлось бы анализировать все вручную, я бы не получил объектно-ориентированный подход.
BobbyShaftoe
93
Вы имеете в виду, что вы не получите бесплатный обед. Ручной анализ не имеет ничего общего с ОО. Я мог разобрать все на бумаге, используя мой самый продвинутый инструмент - карандаш HB1, и он все равно был бы ОО.
Нил
8
Я считаю, что под ОО автор подразумевал связывание Java-XML. Каким будет ваш следующий шаг в этом подходе для анализа ответа? А если в нем сотни элементов, организованных в древовидную структуру?
rustyx
12
Кстати, я бы ожидал, по крайней мере, HTTP POST, а не GET, если вы хотите иметь успех с SOAP. Кроме того, где находятся заголовки Accept и SOAPAction? Если вы действительно хотите перейти на коммандос, потребуется больше, чем эти 4 строки, чтобы использовать службу SOAP.
rustyx
6
@NeilD: Что, если обстоятельства были вынуждены использовать SOAP, например, веб-сервер использует SOAP, и вы не можете это контролировать?
Бьярке Фрейнд-Хансен
59

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

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

Виктор Брешан
источник
31

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

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

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

Priyanjan
источник
30

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

jasonhudgins
источник
2
В аду есть особое место для тех, кто заставляет разработчиков использовать сервисы SOAP вместо REST API.
Хитеш Саху
24

Около года назад я читал эту ветку, пытаясь выяснить, как выполнять вызовы 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;
}

Я использовал его для своего собственного проекта, но я подумал, что это может помочь некоторым другим людям, поэтому я потратил некоторое время на то, чтобы отделить его и задокументировать. Мне бы очень понравилось, если бы некоторые из ваших бедных душ, которые наткнулись на эту ветку, когда гуглили «SOAP Android», могли бы попробовать и получить какую-то выгоду.

Алекс Гиллер
источник
вы работали с сессионной аутентификацией на IceSoap?
Adnen Chouibi
24

НЕ ЗАБУДЬТЕ ДОБАВИТЬ ksoap2.jar в свой проект, а также добавить разрешение ИНТЕРНЕТ в файле AndroidManifest

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class WebserviceActivity extends Activity {

    private static final String NAMESPACE = "https://api.authorize.net/soap/v1/";
    private static final String URL ="https://apitest.authorize.net/soap/v1/Service.asmx?wsdl"; 
    private static final String SOAP_ACTION = "https://api.authorize.net/soap/v1/AuthenticateTest";
    private static final String METHOD_NAME = "AuthenticateTest";
    private TextView lblResult;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        lblResult = (TextView) findViewById(R.id.tv);

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
        request.addProperty("name","44vmMAYrhjfhj66fhJN");
        request.addProperty("transactionKey","9MDQ7fghjghjh53H48k7e7n");
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        try {
            androidHttpTransport.call(SOAP_ACTION, envelope);

            //SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            // SoapPrimitive  resultsRequestSOAP = (SoapPrimitive) envelope.getResponse();
            SoapObject resultsRequestSOAP = (SoapObject) envelope.bodyIn;


            lblResult.setText(resultsRequestSOAP.toString());
            System.out.println("Response::"+resultsRequestSOAP.toString());


        } catch (Exception e) {
            System.out.println("Error"+e);
        }

    }
}
Амит Кумар
источник
HttpTransportSE, где я могу получить этот класс?
Номан
Здравствуйте! Я использую ваш код, но получаю следующую ошибку: Response :: AuthenticateTestResponse {AuthenticateTestResult = anyType {resultCode = Error; сообщения = anyType {MessagesTypeMessage = anyType {код = E00014; text = Аутентификация продавца обязательна .; }; }; }; } не могли бы вы мне помочь, пожалуйста?
Хасмух
привет Amit, я также amit ..... Можете ли вы сказать мне, как ответ мы сравниваем, когда мы получили ответ, является успешным или нет так, как и какие условия, чтобы проверить ответ ......
Amitsharma
Как добавить массив в XML свойства запроса?
droidster.me
21

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

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

Samuh
источник
18

Вы можете взглянуть на WSClient ++

Акаш Кава
источник
4
Наконец первый полезный ответ после повторения kSoap или SAX
rustyx
Я попробовал демо-версию. У меня не работал простой сервис. Не стоит тратить так много $$$$$.
Тушар
16

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

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

Габор AUTH
источник
1
Я имел удовольствие присутствовать на вашей презентации на ЮМО XVII. Будапешт об этом материале Android. Продолжайте хорошую работу!
pcjuzer
15

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

Ив
источник
14

Звоните ksoap2 методы . Это работает очень хорошо.

Установите детали, как

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

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

а затем чтобы получить результат сделать

androidHttpTransport.call(SOAP_ACTION, envelope);
result = (SoapPrimitive)envelope.getResponse();
ДЕВАНГ ШАРМА
источник
11

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

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

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

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

например:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • Вам не нужно заботиться о классе обслуживания / req / response или о любых других классах, а также о методе, поскольку вы знаете, что все они генерируются из WSDL.
  • И, конечно, вам не нужно знать о мыльном действии / конверте / пространстве имен и т. Д. Просто вызовите метод, как мы, разработчики, делаем все время.
Асрафул Хак
источник
Вы знаете, как бороться с датой? Apache CXF переведите его в XMLGregorianCalendar, который я не могу создать в Android.
Мартин Нук,
9

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

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

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

Из файла WSDL,

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

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

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

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

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

Manick
источник
6

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

http://easywsdl.com/

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

robocik
источник
5

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

miroslavign
источник
5

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

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

Сачин Д
источник
4

Пожалуйста, скачайте и добавьте файл библиотеки SOAP с вашим именем файла проекта: ksoap2-android-assembly-3.4.0-jar-with-dependencies

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

Вот код для вызова службы SOAP

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

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

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

        HttpTransportSE transport = new HttpTransportSE(URL);

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

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

Результаты могут быть JSONObject или JSONArray или String

Для вашей лучшей справки, https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/

Спасибо.

локеш с
источник
3

Это рабочий пример использования SOAP веб-сервисов в 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();
    }
}
Arun
источник
Пожалуйста, помогите мне в этом вопросе stackoverflow.com/questions/41573829/…
Edijae Crusar
3

Вы можете выполнить мыльный вызов как сообщение через 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
Два вопроса по этому вопросу: 1. Как это называется из основной деятельности? 2. Каким должно быть значение StringUrlShipment, которое передается в качестве параметра?
Тори
в приведенном выше комментарии проигнорируйте вопрос № 1.
Тори
Из основной деятельности вы должны использовать AsyncTask для вызова этого кода. Внутри этого класса AsyncTask реализуйте doInBackground для запуска этого кода
Лапенков Владимир
2

Чтобы вызвать веб-сервис 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 чч как сравнить результат ответа с результатом ответа дающего: ..
Амитшарма
1

Добавить мыло Libaray (ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar ):

public static String 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;
    }

}
Mani
источник