Пример взаимодействия с 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
superb article . Will definitely copy it to my blog.Thanks.
Best Article bunch android and web service for dot ne