Intereting Posts
Как перенести одну из моих Android-приложений на другую учетную запись разработчика Android (не мой) Как сделать многостраничный текст? Как создать массив массивов с данными курсора в Android Как протестировать приложение Android в нескольких действиях? Android: Как сделать клавиатуру всегда видимой? Как включить самозаверяющий сертификат для сокетов SSL на Android? Использование AppCompat 'layout_behavior' с '@ string / appbar_scrolling_view_behavior' вызывает исключение Уменьшите размер растрового изображения до определенного пикселя в Android Вывод аннотаций Proguard в приложении Android Как изменить цветную часть TextView? Что нужно использовать в качестве полезной нагрузки разработчика в API-интерфейсах Google In-App Billing? IndexNotReadyException – Android Studio Ошибка компиляции студии Android «Содержимое не допускается в прологе» Android – я хочу показать пользователю процесс загрузки файлов Как открыть «переднюю камеру» на платформе Android?

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

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

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

Solutions Collecting From Web of "Как вызвать веб-службу SOAP на Android"

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Вызовите методы 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(); 

Надеюсь, вам поможет вызов веб-сервиса с Android .

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

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

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

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

  • Из 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.
  • И, конечно же, вам не нужно знать о действии мыла / огибающей / пространстве имен и т. Д. Просто позвоните по методу, поскольку мы, разработчики, делаем все это время.

Я думаю, что Call SOAP Web Service из Android-приложения вам очень поможет.

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

Из файла WSDL,

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

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

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

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

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

Если вы можете использовать JSON, в разделе « Разработка приложений с серверами PHP и Android Phone Clients» есть документ, видео и образец.

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

http://easywsdl.com/

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

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

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

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

Это рабочий пример использования веб-сервисов 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(); } } 

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

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

Благодарю.

Чтобы вызвать веб-службу 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; } } 

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

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