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

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

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

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

  • Создание простого HTTP-соединения посредством с использованием стандартного API Java HttpURLConnection.
  • Форма запроса SOAP. (Ты можешь сделать помощь SOAPUI сделать SOAP запрос.)
  • Установите флаг doOutPut как истинный.
  • Задайте значения заголовков HTTP, например контент-длина, контент тип и User-agent. Не забудь для установки значения Content-length, поскольку оно является обязательным.
  • Введите весь запрос SOAP в выходной поток.
  • Вызовите метод для подключения и получить ответ (в моем случае я использовал getResonseCode).
  • Если ваш полученный код ответа как
    1. Это означает, что вам удастся вызвать веб-службу.
Теперь возьмите входной поток на том же HTTP и получить строковый объект. Этот строковый объект ответ SOAP. Если код ответа отличается от 200 затем возьмите поток ErrorInput тот же HTTP-объект и получить ошибка, если таковая имеется. Анализ полученного ответа  используя SAXParser (в моем случае) или  DOMParaser или любой другой синтаксический анализ  механизм.

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

НЕ ЗАБЫВАЙТЕ ADD 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);
        }

    }
}

Ответ 8

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

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

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

Ответ 12

Вызвать 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);

а затем для получения результата do

androidHttpTransport.call(SOAP_ACTION, envelope);
result = (SoapPrimitive)envelope.getResponse();

Ответ 15

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

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

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

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

например:

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

Ответ 18

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

Из файла WSDL

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

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

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

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

  • Проведите анализ потока ответов с помощью парсера XML Pull.

Ответ 19

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

http://easywsdl.com/

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

Ответ 20

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

Ответ 21

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

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

Ответ 22

Это рабочий пример использования веб-сервисов SOAP в android.

** Примечание:: *** НЕ ЗАБУДЬТЕ ADD 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();
    }
}

Ответ 23

Загрузите и добавьте файл библиотеки 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/

Спасибо.

Ответ 24

Чтобы вызвать веб-службу SOAP с android, попробуйте использовать этот клиент

НЕ ЗАБУДЬТЕ ADD 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;
    }
}

Ответ 25

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

Ответ 26

Добавить мыло 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 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 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;
    }

}