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.