Пример взаимодействия с web-сервисами (wcf) из андроид-приложения

Пример взаимодействия с web-сервисами (для .Net) из java-андроид-приложения. Перед использованием сниппета скачать и добавить к проекту библиотеку KSOAP2 (брать оттуда).

Предполагается, что на сервере 127.0.0.1, на порту 11111 крутится .NET-веб-сервис. Из андроид-приложения мы хотим вызвать зарегистрированную на нем функцию Remote_Function_Name с целочисленным параметром Param_For_Remote_Function. Веб-сервис поддерживает некоторую простейшую авторизацию, на основе анализа заголовка SOAP-запроса. Поэтому, формируя SOAP-запрос мы добавляем к заголовку Security_Header. Разумеется, эти параметры будут варьироваться в зависимости от NET-сервисов – что там за функции, какие у них параметры, каким образом производится анализ заголовков SOAP-запросов и т.п.

В данном примере, вызов удаленной функции осуществляется из андроид-приложения функцией Check_Soap_Service принимающей два параметра, используемые при формировании SOAP-запроса: Param_For_Remote_Function и Security_Header. Функция вызывается сразу при создании класса activity в методе onCreate().

Данные в тело (body) SOAP запроса добавляются вызовом метода addProperty. В данном примере тело запроса содержит только одну пару ключ-значение – “Param_For_Remote_Function” и ее значение переданное в функцию. Эти данные будут использоваться в качестве параметров вызываемой функции. Порядок – не важен, будьте внимательнее с регистром букв в названиях. Данные в заголовок SOAP запроса добавляются через формирования списка значений типа Element и передачей этого списка в качестве дополнительного параметра объекта soapEnvelope – soapEnvelope.headerOut. Список формируется с помощью отдельной функции Form_Header.

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

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;
/*
additional imports goes here
*/

public class Check_Soap extends Activity
{
    // for example only,
    // in real app you better get this data from settings file,
    private static final String SOAP_ACTION="http://tempuri.org/IServiceData/Remote_Function_Name";
    private static final String SOAP_METHOD_NAME="Remote_Function_Name";
    private static final String URL = "http://127.0.0.1:11111/ServiceData.svc";
    private static final String NAMESPACE="http://tempuri.org/";

    private Element Form_Header(String Security_Header_Value)
    {
        Element h = new Element().createElement(NAMESPACE, "Security_Header");
        h.addChild(Node.TEXT, Security_Header_Value);

        /*
        for several nodes it would be:
        Element h = new Element().createElement(NAMESPACE, "Security_Header");
        Element h_first = new Element().createElement(NAMESPACE, "Security_Header_Value_First");
    	h_first.addChild(Node.TEXT, Security_Header_Value_First);
        h.addChild(Node.ELEMENT, h_first);
        Element h_second = new Element().createElement(NAMESPACE, "Security_Header_Value_Second");
    	h_second.addChild(Node.TEXT, Security_Header_Value_Second);
        h.addChild(Node.ELEMENT, h_second);
        */
        return h;
    }

    public void Check_Soap_Service(String Security_Header,int Param_For_Remote_Function)
    {

        SoapObject Request = new SoapObject(NAMESPACE,SOAP_METHOD_NAME);

        // here you form body of your SOAP-request
        Request.addProperty("Param_For_Remote_Function", Param_For_Remote_Function);

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

        soapEnvelope.setAddAdornments(false);
        soapEnvelope.encodingStyle = SoapSerializationEnvelope.ENC;
        soapEnvelope.env=SoapSerializationEnvelope.ENV;
        soapEnvelope.implicitTypes = true;

        // here you form additional header's data for your SOAP request
        soapEnvelope.headerOut = new Element[1];
        soapEnvelope.headerOut[0] = Form_Header(Security_Header);

        soapEnvelope.setOutputSoapObject(Request);

        HttpTransportSE aht = new HttpTransportSE(URL);
        aht.debug = true;

        try
        {
            aht.call(SOAP_ACTION, soapEnvelope);
            SoapPrimitive resultString = ( SoapPrimitive)soapEnvelope.getResponse();
            //TODO: appropriate parsing and processing routine for resultString
            Log.i("Check_Soap_Service","resultString -  "+resultString);
        }
        catch (Exception e)
        {
            Log.i("Check_Soap_Service","Exception : "+e.toString());
        }
        finally
        {
            Log.i(getClass().getSimpleName(),"requestDump : "+aht.requestDump);
            Log.i(getClass().getSimpleName(),"responseDump : "+aht.responseDump);
        }
    }

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

        // test our web-service
        // fake parameters for remote function
        String Security_Header_String="User_ID_1";
        int Soap_Request_Id=1;
        Check_Soap_Service(Security_Header_String,Soap_Request_Id);
    }
}

Полезные ссылки KSOAP2, SOAP в связке с JAVA и Android
вики KSOAP2:
http://code.google.com/p/ksoap2-android/wiki/CodingTipsAndTricks
Взаимодействие с .NET-вебсервисами из андроида:
http://romenlaw.blogspot.com/2008/07/consuming-wcf-web-service-using-java.html
пример реализации клиента для аспшного вебсервиса:
http://naveenbalani.com/index.php/2011/01/invoke-webservices-from-android/
полный пример андроид-клиента для SOAP-запросов:
http://stackoverflow.com/questions/2589486/how-to-call-a-wcf-service-using-ksoap2-on-android
Андроид, формирование заголовков SOAP-запросов:
http://stackoverflow.com/questions/2566026/ksoap2-android-not-valid-soap
http://stackoverflow.com/questions/5613675/how-to-set-soap-header-using-ksoap2-android
пример REST-веб-сервиса:
http://senior.ceng.metu.edu.tr/2009/praeda/2009/01/11/a-simple-restful-client-at-android/
Основные ошибки работы с SOAP-сервисами из андроид:
http://stackoverflow.com/questions/6215480/trying-to-connect-android-app-to-net-svc-webservice-and-server-responds-media
http://stackoverflow.com/questions/5921170/invoke-wcf-web-service-using-ksoap2-on-android-app-failed-with-the-following-erro
Не забывайте о правильности настроек самого NET-сервера:
http://stackoverflow.com/questions/6166589/making-a-wcf-service-android-compatible
утилита для отслеживания веб-трафика (в том числе для .NET проектов)
http://www.fiddler2.com/fiddler2/
описание KSOAP:
http://androidwsproject.blogspot.com/2010/04/android-ksoap2-framework.html
http://unknownerror.net/2011-06/41434-ksoap2-webservice.html
http://people.unica.it/bart/2010/12/03/ksoap2-patch-for-user-defined-objects-and-arrays/

2 comments

  1. superb article . Will definitely copy it to my blog.Thanks.

    • Sergey on August 9, 2014 at 7:27 pm
    • Reply

    Best Article bunch android and web service for dot ne

Leave a Reply

Your email address will not be published.