Як викликати веб-службу SOAP на Android [закрито]


553

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

В основному веб-сервіс - це лише створений в NetBeans . Я хотів би мати підтримку IDE для генерації сантехнічних класів. Мені просто потрібен найпростіший / найелегантніший спосіб зв’язатися з веб-службою на базі WSDL з телефону на базі ОС Android.


Ось дуже гарне посилання на використання SOAP в андроїді: Як зателефонувати в веб-сервіс в Android за допомогою SOAP
Jainendra

Якщо хтось раніше знайомий з MS VS, використання Mono для Android вирішить багато проблем із службами передачі даних та веб-сервісами, все просто і швидко розвивається. Крім того, хто не знайомий з C # (код дуже схожий на Java), у всій бібліотеці є однакові методи, деякі функції замінені на властивості, тому імена майже однакові і хто писав раніше на Java для android може дуже легко, використовуючи свій досвід для написання c # код.
Євген Босиков

Подивіться нижче. Посилання має детальний Eaxample щодо доступу до веб-сервісу в Android За допомогою Ksoap2 Доступ до
Фред Ондіекі

Я вважаю, що це можливо за допомогою 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, але я не знаю багато про це.


7
Так, я думаю, що мені доведеться створити проксі-сервер REST. Дуже дивно здається, що Google не зацікавлений у наданні підтримки SOAP. Я спробував метод kSoap, це насправді навіть не серйозна альтернатива. Це, в кращому випадку, некрасиво, що вимагає сильного вишукування груп новин.
BobbyShaftoe

19
Причина, ймовірно, в тому, що SOAP дуже багатослівний і недостатньо добре виконує обмеження мобільних обчислень.
Ніл

92
Цю відповідь було б покращено, якби хтось міг запропонувати найкращу альтернативу виклику веб-служб за допомогою програми Android. Як тільки люди знайдуть це питання і прочитають його, саме це і буде шукати більшість з них.
MGOwen

4
Обробка SOAP також є пам'яттю та процесором, порівняно з більш стислим форматом, як JSON.
Джеремі Едвардс

3
@MGOwen Найкраща альтернатива, яку я бачу, - це проксі. Реалізуйте інтерфейс, що підтримує REST, який підтримує конверти SOAP через WSDL2Java.

99

org.apache.http.impl.client.DefaultHttpClientза замовчуванням поставляється в SDK для Android. Це дозволить вам підключитися до 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, і все одно це буде OO.
Ніл

8
Я вважаю, що OO автор означав прив'язку Java-XML. Який був би ваш наступний крок у цьому підході для аналізу відповіді? А якщо в ньому є сотні елементів, організованих у структурі дерева?
rustyx

12
BTW, я б очікував, що принаймні HTTP POST не GET, якщо ви хочете повезти з SOAP. Крім того, де заголовки Accept і SOAPAction? Якщо ви дійсно хочете перейти до командосу, для споживання послуги SOAP знадобиться набагато більше, ніж ці 4 рядки.
rustyx

6
@NeilD: Що робити, якщо вас обставини змусили використовувати SOAP, наприклад, веб-сервер використовує SOAP, і ви не контролюєте це?
Bjarke Freund-Hansen

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 як істинний.
  4. Встановіть значення заголовка HTTP, такі як довжина вмісту, тип вмісту та користувальницький агент. Не забудьте встановити значення довжини вмісту, оскільки воно є обов'язковим.
  5. Запишіть весь запит SOAP у вихідний потік.
  6. Зателефонуйте до способу встановлення зв'язку та отримання відповіді (у моєму випадку я використовував getResonseCode).
  7. Якщо ваш отриманий код відповіді як
    1. Це означає, що вам вдалося зателефонувати в веб-сервіс.
  8. Тепер візьміть вхідний потік того ж HTTP-з'єднання та отримайте об’єкт рядка. Цей рядковий об'єкт - відповідь SOAP.
  9. Якщо код відповіді відрізняється від 200, тоді ErrorInputперейдіть потік на той самий HTTPоб'єкт і отримайте помилку, якщо така є.
  10. Проаналізуйте отриману відповідь за допомогою SAXParser (в моєму випадку) або DOMParaser або будь-якого іншого механізму розбору.

Я реалізував цю процедуру для телефону Android, і вона успішно працює. Я можу проаналізувати відповідь, навіть якщо вона перевищує 700 Кб.


30

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


2
У пеклі є особливе місце для тих, хто змушує розробників використовувати послуги SOAP замість REST API.
Hitesh Sahu

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", могли б відмовитись та отримати певну користь.


Ви працювали з Authentication session на IceSoap?
Adnen Chouibi

24

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

    }
}

HttpTransportSE Де я можу отримати цей клас ??
Номан

Привіт, я використовую ваш код, але я отримую наступну помилку, Response :: AuthenticateTestResponse {AuthenticateTestResult = anyType {resultCode = Помилка; messages = anyType {MessagesTypeMessage = anyType {код = E00014; текст = Потрібна автентифікація продавця; }; }; }; } можеш допомогти мені, будь ласка?
Хасмух

привіт Amit Im також amit ..... Чи можете ви сказати мені, як відповідь ми порівнюємо, коли ми отримали відповідь успішна чи ні. Як і в яких умовах перевірити відповідь ......
Amitsharma

як додати масив у xml властивості запиту?
droidster.me

21

Я мав найпростіший досвід із KSOAP; Я обрав досить простіший підхід.

Враховуючи файл WSDL, створіть шаблони запиту SOAP для кожного запиту (наприклад: за допомогою SOAP UI) та замініть значення, що передаються в код. Розмістіть ці дані в кінцевій точці служби за допомогою примірника DefaultHttpClient і отримайте потік відповідей. Розбір потоку відповідей за допомогою аналізатора XML Pull.


18

Ви можете подивитися WSClient ++


4
Нарешті перша корисна відповідь після повторення або kSoap чи SAX
rustyx

Я спробував демо-версію. Не працював для мене за просту послугу. Не варто витрачати стільки $$$$$.
Тушар

16

Я створив новий клієнт SOAP для платформи Android. Він використовує інтерфейс, створений JAX-WS, але поки що це лише доказ концепції.

Якщо вам цікаво, спробуйте приклад та / або перегляньте джерело на AndroidSOAP .


1
Я мав задоволення відвідати вашу презентацію у XVII JUM. Будапешт про цю програму 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 Stub, поставте його у свій проект.
  • Скажіть для деякої послуги "ComplexOperationService", миттєво активізуйте сервіс, отримайте порт Endpoint та зателефонуйте до способу обслуговування та отримайте відповідь від веб-служби:

наприклад:

ComplexOperationService service = new ComplexOperationService( );
ComplexOperation port= service.getComplexOperationPort();    
SomeComplexRequest request = --Get some complex request----;    
SomeComplexResp resp = port.operate( request  );
  • Вам не потрібно дбати про клас обслуговування / req / відповідь або будь-які інші класи та метод, оскільки ви знаєте, що всі вони генеруються з WSDL.
  • І звичайно, вам не потрібно знати про дію / конверт / простір мила тощо. Просто зателефонуйте методу, як ми, розробники постійно.

Чи знаєте ви, як поводитися з Датою? Apache CXF переклав це на XMLGregorianCalendar, який я не в змозі створити в Android.
Мартін Нук



6

Виконайте ці кроки методом SOAP

З файлу WSDL

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

  • Потім замініть значення, що передаються в код.

  • Розмістіть ці дані в кінцевій точці служби за допомогою екземпляра DefaultHttpClient.

  • Отримайте потік відповідей і нарешті

  • Розбір потоку відповідей за допомогою аналізатора XML Pull.



6

Для мене найпростіший спосіб - використовувати хороший інструмент для генерації всіх необхідних класів. Особисто я використовую цей сайт:

http://easywsdl.com/

Він підтримує досить складні веб-сервіси та використовує ksoap2.


5

Я б запропонував перевірити дуже корисний інструмент, який мені дуже допоміг. Хлопці, які опікуються цим проектом, теж були дуже корисні. www.wsdl2code.com/


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-зависимост

Очистіть програму та запустіть програму

Ось код для виклику служби 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 Or String

Для кращої довідки https://trinitytuts.com/load-data-from-soap-web-service-in-android-application/

Дякую.


3

Це робочий приклад використання веб-служб 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

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 Hh, як порівняти відповідь відповіді від результату відповіді даючого: - успіх ..... "відповідь = 1 ~ Успіх" .... так, як ми порівнюємо цей результат за умовою, що з боку сервера ...... ..
Амітшарма

1

Додати 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;
    }

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.