- Статьи и примеры
- | Веб сервисы
- | Сравнение скорости работы четырех клиентов веб сервисов
- | Сравнение скорости работы четырех клиентов веб сервисов страница 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