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