- Статьи и примеры
- | Веб сервисы
- | Сравнение скорости работы четырех клиентов веб сервисов
- | Сравнение скорости работы четырех клиентов веб сервисов страница 4
Сравнение скорости работы четырех клиентов веб сервисов Страница 4
Клиент XmlPullParser
В примере использовалась версия XmlPullParser 2.1.10, скачать которую можно тут. Тестовый метод выглядит так:
private String xmlPullParserTest() throws XmlPullParserException, IOException{
String request = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" " +
"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +
"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><soapenv:Body>" +
"<methodRequest reqString=\""+testString+"\" xmlns=\"http://localhost\"/>" +
"</soapenv:Body></soapenv:Envelope>";
String response = getResponse("http://127.0.0.1:80/joker/wsbase",request,
"http://127.0.0.1:80/joker/wsbase/shift",10000);
String ret = "";
pp.setInput(new StringReader(response));
byte type; // received event type
XmlStartTag stag = factory.newStartTag();
while(true) {
type = pp.next();
if(type == XmlPullParser.START_TAG){
pp.readStartTag(stag);
if("methodResponse".equals(stag.getLocalName())){
ret = stag.getAttributeValueFromRawName("resString");
break;
}
}
if(type == XmlPullParser.END_DOCUMENT) break;
}
return java.net.URLDecoder.decode(ret,"UTF-8");
}
Как видим ничего сложного. Единственное — придется написать вспомогательный метод для отсылки запроса и получения результата. Он называется getResponse. Вот такой метод:
private String getResponse(String urlString, String requestXML, String action, int timeOut) {
URL targetURL = null;
try {
targetURL = new URL(urlString);
} catch (MalformedURLException e) {e.printStackTrace();}
URLConnection con = null;
try {
con = targetURL.openConnection();
} catch (IOException e) {e.printStackTrace();}
con.setDoInput (true);
con.setDoOutput (true);
con.setRequestProperty("Content-Type", "text/xml");
con.setRequestProperty("Content-Length",String.valueOf(requestXML.getBytes().length));
con.setRequestProperty("charset", "utf-8");
con.setRequestProperty("SOAPAction", "\"" + action + "\"");
if (timeOut > 0) con.setReadTimeout(timeOut);
con.setUseCaches(false);
con.setAllowUserInteraction(false);
// send data:
DataOutputStream dataOut = null;
try {
dataOut = new DataOutputStream(con.getOutputStream());
} catch (IOException e) {e.printStackTrace();}
try {
dataOut.writeBytes(requestXML);
dataOut.flush();
dataOut.close();
} catch (IOException e) {e.printStackTrace();}
// read response:
InputStream is = null;
StringBuffer out = null;
try {
is = con.getInputStream();
out = new StringBuffer();
byte[] b = new byte[BUFFER_SIZE];
for (int n; (n = is.read(b)) != -1;) {
out.append(new String(b, 0, n));
}
is.close();
} catch (IOException e) {e.printStackTrace();}
return out.toString();
}
А теперь все вместе
Настала пора все соединить, запустить и посмотреть, что из этого выйдет. Приступим. Пишем main:
public static void main(String[] args) throws Exception {
long startTime;
Client c = new Client();
System.out.println("\nPlainTest Test");
startTime = System.currentTimeMillis();
c.xmlPullParserTest();
System.out.println("Time elapsed: "+(System.currentTimeMillis()-startTime)+"ms");
System.out.println("\nWSImport Test");
startTime = System.currentTimeMillis();
c.wSImportTest();
System.out.println("Time elapsed: "+(System.currentTimeMillis()-startTime)+"ms");
System.out.println("\nAxisTest Test");
startTime = System.currentTimeMillis();
c.axisTest();
System.out.println("Time elapsed: "+(System.currentTimeMillis()-startTime)+"ms");
System.out.println("\nCastor Test");
startTime = System.currentTimeMillis();
c.castorTest();
System.out.println("Time elapsed: "+(System.currentTimeMillis()-startTime)+"ms");
}
Запускаем. Для получения корректного результата необходимо запустить приложение еще раз. И вот оно что получилось:
PlainTest Test Time elapsed: 15ms WSImport Test Time elapsed: 31ms AxisTest Test Time elapsed: 172ms Castor Test Time elapsed: 250ms
На этом пример можно считать законченным. Явный лидер налицо. Однако, мы не станем делать вывод о повсеместном использовании ручного метода составления запроса и разбора результата. Еще раз повторим — многое зависит от конкретных условий разработки проекта, его сложности. К тому же и пример наш был достаточно простой.
Файлы, используемые в статье.
Александр Смелков
Санкт-Петербург Осень 2008
