Java Soap client
В предыдущей заметке было написано, как поднять SOAP веб сервис за 5 минут. В этой заметке, мы напишем SOAP клиент за те же самые 5 минут 😉 Вопреки ожиданиям, делать это мы будем вовсе не встроенными средствами Java SE. Мы будем использовать библиотеку KSOAP. Т.к. по своей специализации, я являюсь Android разработчиком, данный код будет прекрасно работать как в Java SE, так и в Android. У нас есть некий SOAP метод getCodeUser. На вход он принимает String параметр “user”, на выходе возвращает String параметр некого кода.
public class GetCodeUser { String user; public GetCodeUser(String user){ this.user = user; } public String soapRequest() { HttpTransportSE httpTransport=null; try{ String method = "getCodeUser"; SoapObject request = new SoapObject(MainAsync.NAMESPACE, method); PropertyInfo pi1 = new PropertyInfo(); pi1.setName("user"); pi1.setValue(user); pi1.setType(String.class); request.addProperty(pi1); SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.setOutputSoapObject(request); httpTransport = new HttpTransportSE(MainAsync.wsdlSchema); httpTransport.debug=true; httpTransport.call(MainAsync.getSoapAction(method), envelope); SoapObject result =(SoapObject) envelope.bodyIn; String objectSerialization = result.getProperty("return").toString(); return objectSerialization;</pre> } catch (Exception e) { return""; } finally{ if(httpTransport!=null) httpTransport.reset(); } } }
Параметры запроса очень простые:
MainAsync.NAMESPACE - пространство имен. В wsdl оно прекрасно видно в описании.
MainAsync.wsdlSchema - ссылка с wsdl SOAP веб сервиса. И отдельно надо немного написано про статический метод : MainAsync.getSoapAction(method) - Если при работе с SOAP библиотекой получаете Exception, связанный с неправильным именем веб метода, при вызове добавьте следующее форматирование:
public static String getSoapAction(String method) { return "\"" + NAMESPACE + method + "\""; }
P.S. для новичков подскажу – если собираетесь использовать данный код в Android, не забудьте завернуть этот код как минимум в отдельный поток, а лучше всего в AsyncTask.