android连接webservice(通用,可使用复杂返回值)

来源:互联网 发布:张靓颖乳钉 知乎 编辑:程序博客网 时间:2024/06/01 08:46

本文为原创,转载请注明出处:http://blog.csdn.net/zhyl8157121/article/details/8709048


首先,说一下适用范围:

  1. 当使用java版的webservice的时候,可以直接使用KSOAP2这个类库,直接调用其方法就可以了。具体方法可以自行Google。
  2. 当使用.NET版的webservice的时候,KSOAP2这个类库不是很好用,我研究了一个下午没研究明白(可能是方法问题吧,欢迎大家共同交流)。所以,我就对这篇博客http://blog.csdn.net/zhyl8157121/article/details/8169172中的HttpConnSoap类进行了修改。目的是获取并解析复杂类型的返回值。

1.HttpConnSoap

[java] view plaincopyprint?
  1. <span style="font-size:14px;">package com.bottle.stockmanage;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.OutputStream;  
  6. import java.net.HttpURLConnection;  
  7. import java.net.URL;  
  8. import java.util.ArrayList;  
  9.   
  10. public class HttpConnSoap {  
  11.     public ArrayList<String> GetWebServre(String methodName, ArrayList<String> Parameters, ArrayList<String> ParValues) {  
  12.         ArrayList<String> Values = new ArrayList<String>();  
  13.           
  14.         //ServerUrl是指webservice的url  
  15.         //10.0.2.2是让android模拟器访问本地(PC)服务器,不能写成127.0.0.1  
  16.         //11125是指端口号,即挂载到IIS上的时候开启的端口  
  17.         //Service1.asmx是指提供服务的页面  
  18.         String ServerUrl = "http://10.0.2.2:11125/Service1.asmx";  
  19.           
  20.         //String soapAction="http://tempuri.org/LongUserId1";  
  21.         String soapAction = "http://tempuri.org/" + methodName;  
  22.         //String data = "";  
  23.         String soap = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"  
  24.                 + "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"  
  25.                 + "<soap:Body />";  
  26.         String tps, vps, ts;  
  27.         String mreakString = "";  
  28.   
  29.         mreakString = "<" + methodName + " xmlns=\"http://tempuri.org/\">";  
  30.         for (int i = 0; i < Parameters.size(); i++) {  
  31.             tps = Parameters.get(i).toString();  
  32.             //设置该方法的参数为.net webService中的参数名称  
  33.             vps = ParValues.get(i).toString();  
  34.             ts = "<" + tps + ">" + vps + "</" + tps + ">";  
  35.             mreakString = mreakString + ts;  
  36.         }  
  37.         mreakString = mreakString + "</" + methodName + ">";  
  38.         /* 
  39.         +"<HelloWorld xmlns=\"http://tempuri.org/\">" 
  40.         +"<x>string11661</x>" 
  41.         +"<SF1>string111</SF1>" 
  42.         + "</HelloWorld>" 
  43.         */  
  44.         String soap2 = "</soap:Envelope>";  
  45.         String requestData = soap + mreakString + soap2;  
  46.         //System.out.println(requestData);  
  47.   
  48.         try {  
  49.             URL url = new URL(ServerUrl);  
  50.             HttpURLConnection con = (HttpURLConnection) url.openConnection();  
  51.             byte[] bytes = requestData.getBytes("utf-8");  
  52.             con.setDoInput(true);  
  53.             con.setDoOutput(true);  
  54.             con.setUseCaches(false);  
  55.             con.setConnectTimeout(6000);// 设置超时时间  
  56.             con.setRequestMethod("POST");  
  57.             con.setRequestProperty("Content-Type""text/xml;charset=utf-8");  
  58.             con.setRequestProperty("SOAPAction", soapAction);  
  59.             con.setRequestProperty("Content-Length""" + bytes.length);  
  60.             OutputStream outStream = con.getOutputStream();  
  61.             outStream.write(bytes);  
  62.             outStream.flush();  
  63.             outStream.close();  
  64.             InputStream inStream = con.getInputStream();  
  65.   
  66.             //data=parser(inStream);  
  67.             //System.out.print("11");  
  68.             Values = inputStreamtovaluelist(inStream, methodName);  
  69.             //System.out.println(Values.size());  
  70.             return Values;  
  71.   
  72.         } catch (Exception e) {  
  73.             System.out.print("2221");  
  74.             return null;  
  75.         }  
  76.     }  
  77.   
  78.     public ArrayList<String> inputStreamtovaluelist(InputStream in, String MonthsName) throws IOException {  
  79.         StringBuffer out = new StringBuffer();  
  80.         String s1 = "";  
  81.         byte[] b = new byte[4096];  
  82.         ArrayList<String> Values = new ArrayList<String>();  
  83.         Values.clear();  
  84.   
  85.         for (int n; (n = in.read(b)) != -1;) {  
  86.             s1 = new String(b, 0, n);  
  87.             out.append(s1);  
  88.         }  
  89.   
  90.         System.out.println(out);  
  91.         String[] s13 = s1.split("><");  
  92.         String ifString = MonthsName + "Result";  
  93.         String TS = "";  
  94.         String vs = "";  
  95.   
  96.         Boolean getValueBoolean = false;  
  97.         for (int i = 0; i < s13.length; i++) {  
  98.             TS = s13[i];  
  99.             System.out.println(TS);  
  100.             int j, k, l;  
  101.             j = TS.indexOf(ifString);  
  102.             k = TS.lastIndexOf(ifString);  
  103.   
  104.             if (j >= 0) {  
  105.                 System.out.println(j);  
  106.                 if (getValueBoolean == false) {  
  107.                     getValueBoolean = true;  
  108.                 } else {  
  109.   
  110.                 }  
  111.   
  112.                 if ((j >= 0) && (k > j)) {  
  113.                     System.out.println("FFF" + TS.lastIndexOf("/" + ifString));  
  114.                     //System.out.println(TS);  
  115.                     l = ifString.length() + 1;  
  116.                     vs = TS.substring(j + l, k - 2);  
  117.                     //System.out.println("fff"+vs);  
  118.                     Values.add(vs);  
  119.                     System.out.println("退出" + vs);  
  120.                     getValueBoolean = false;  
  121.                     return Values;  
  122.                 }  
  123.   
  124.             }  
  125.             if (TS.lastIndexOf("/" + ifString) >= 0) {  
  126.                 getValueBoolean = false;  
  127.                 return Values;  
  128.             }  
  129.             if ((getValueBoolean) && (TS.lastIndexOf("/" + ifString) < 0) && (j < 0)) {  
  130.                 k = TS.length();  
  131.                 //System.out.println(TS);  
  132.                 vs = TS.substring(7, k - 8);  
  133.                 //System.out.println("f"+vs);  
  134.                 Values.add(vs);  
  135.             }  
  136.   
  137.         }  
  138.   
  139.         return Values;  
  140.     }  
  141.   
  142. }  
  143. </span>  
2.webservice的返回值

[html] view plaincopyprint?
  1. <span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>  
  2. <ArrayOfReview xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/">  
  3.   <Review>  
  4.     <userID>201311521412</userID>  
  5.     <userName>wangjindong</userName>  
  6.     <reviewInfo>哇咔咔哇咔咔哇咔咔</reviewInfo>  
  7.     <reviewDate>2013-3-4 19:33:23</reviewDate>  
  8.   </Review>  
  9.   <Review>  
  10.     <userID>201311521412</userID>  
  11.     <userName>wangjindong</userName>  
  12.     <reviewInfo>abcdefghijklmn</reviewInfo>  
  13.     <reviewDate>2013/2/5 17:07:52</reviewDate>  
  14.   </Review>  
  15. </ArrayOfReview></span>  

可以看到,上面的返回的是一个list<Review>。这样的话,用上面的那个HttpConnSoap就解析不了了。如果只看上面Values的值的话就是空的。这里我们就要对HttpConnSoap类进行一些修改,同时,对这个类进行一下讲解。

3.HttpConnSoap2

[java] view plaincopyprint?
  1. <span style="font-size:14px;">package com.pivotstudio.china.util;  
  2.   
  3. import java.io.InputStream;  
  4. import java.io.OutputStream;  
  5. import java.net.HttpURLConnection;  
  6. import java.net.URL;  
  7. import java.util.ArrayList;  
  8.   
  9. import com.pivotstudio.china.config.AppConfig;  
  10.   
  11. /** 
  12.  * 连接webservice的类 
  13.  * 
  14.  * @author Bottle 
  15.  * 
  16.  * @Date 2013-3-19 下午10:01:21 
  17.  */  
  18. public class HttpConnSoap2  
  19. {  
  20.     /** 
  21.      * 获取返回的InputStream,为了增强通用性,在方法内不对其进行解析。 
  22.      * 
  23.      * @param methodName 
  24.      *            webservice方法名 
  25.      * @param Parameters 
  26.      *            webservice方法对应的参数名 
  27.      * @param ParValues 
  28.      *            webservice方法中参数对应的值 
  29.      * @return 未解析的InputStream 
  30.      */  
  31.     public InputStream GetWebServre (String methodName, ArrayList<String> Parameters, ArrayList<String> ParValues)  
  32.     {  
  33.   
  34.         //指定URL地址,我这里使用的是常量。  
  35.         //如:String ServerUrl = "http://10.0.2.2:11125/Service1.asmx";  
  36.         String ServerUrl = AppConfig.ServerURL;  
  37.   
  38.         //soapAction = 命名空间 + 方法名  
  39.         String soapAction = "http://tempuri.org/" + methodName;  
  40.   
  41.         //拼凑requestData  
  42.         String soap = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"  
  43.                       + "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"  
  44.                       + "<soap:Body />";  
  45.         String tps, vps, ts;  
  46.         String mreakString = "";  
  47.         mreakString = "<" + methodName + " xmlns=\"http://tempuri.org/\">";  
  48.         for (int i = 0; i < Parameters.size(); i++)  
  49.         {  
  50.             tps = Parameters.get (i).toString();  
  51.             //设置该方法的参数为.net webService中的参数名称  
  52.             vps = ParValues.get (i).toString();  
  53.             ts = "<" + tps + ">" + vps + "</" + tps + ">";  
  54.             mreakString = mreakString + ts;  
  55.         }  
  56.         mreakString = mreakString + "</" + methodName + ">";  
  57.         String soap2 = "</soap:Envelope>";  
  58.         String requestData = soap + mreakString + soap2;  
  59.         //其上所有的数据都是在拼凑requestData,即向服务器发送的数据  
  60.   
  61.         try  
  62.         {  
  63.             URL url = new URL (ServerUrl); //指定服务器地址  
  64.             HttpURLConnection con = (HttpURLConnection) url.openConnection();//打开链接  
  65.             byte[] bytes = requestData.getBytes ("utf-8"); //指定编码格式,可以解决中文乱码问题  
  66.             con.setDoInput (true); //指定该链接是否可以输入  
  67.             con.setDoOutput (true); //指定该链接是否可以输出  
  68.             con.setUseCaches (false); //指定该链接是否只用caches  
  69.             con.setConnectTimeout (6000); // 设置超时时间  
  70.             con.setRequestMethod ("POST"); //指定发送方法名,包括Post和Get。  
  71.             con.setRequestProperty ("Content-Type""text/xml;charset=utf-8"); //设置(发送的)内容类型  
  72.             con.setRequestProperty ("SOAPAction", soapAction); //指定soapAction  
  73.             con.setRequestProperty ("Content-Length""" + bytes.length); //指定内容长度  
  74.   
  75.             //发送数据  
  76.             OutputStream outStream = con.getOutputStream();  
  77.             outStream.write (bytes);  
  78.             outStream.flush();  
  79.             outStream.close();  
  80.   
  81.             //获取数据  
  82.             InputStream inputStream = con.getInputStream();  
  83.             return inputStream;  
  84.   
  85.             /** 
  86.              * 此类到此结束了,比原来的HttpConnSoap还短,因为这里没有对返回的数据做解析。数据完全都保存在了inputStream中。 
  87.              * 而原来的类是将数据解析成了ArrayList 
  88.              * <String>格式返回。显然,这样无法解决我们上面的需求(返回值是复杂类型的List) 
  89.              */  
  90.         }  
  91.         catch (Exception e)  
  92.         {  
  93.             e.printStackTrace();  
  94.             return null;  
  95.         }  
  96.     }  
  97.   
  98. }  
  99. </span>  

下面再简单说一下如何解析上面返回的inputStream。

4.XMLParase

[java] view plaincopyprint?
  1. <span style="font-size:14px;">/** 
  2.  * 利用xmlpull解析xml 
  3.  * 
  4.  * @author Bottle 
  5.  * 
  6.  * @Date 2013-3-22 下午4:53:35 
  7.  */  
  8. public class XMLParase  
  9. {  
  10.   
  11.     /** 
  12.      * 解析评论xml信息 
  13.      * @param inputStream 
  14.      * @return 
  15.      */  
  16.     public static ArrayList<CommentInfor> paraseCommentInfors (InputStream inputStream)  
  17.     {  
  18.         ArrayList<CommentInfor> list = new ArrayList<CommentInfor>();  
  19.         XmlPullParser parser = Xml.newPullParser();  
  20.   
  21.         try  
  22.         {  
  23.             parser.setInput (inputStream, "UTF-8");  
  24.             int eventType = parser.getEventType();  
  25.             CommentInfor info = new CommentInfor();  
  26.   
  27.             while (eventType != XmlPullParser.END_DOCUMENT)  
  28.             {  
  29.                 switch (eventType)  
  30.                 {  
  31.                 case XmlPullParser.START_DOCUMENT:// 文档开始事件,可以进行数据初始化处理  
  32.                     break;  
  33.                 case XmlPullParser.START_TAG:// 开始元素事件  
  34.                     String name = parser.getName();  
  35.                     if (name.equalsIgnoreCase ("Review") )  
  36.                     {  
  37.                         info = new CommentInfor();  
  38.                     }  
  39.                     else if (name.equalsIgnoreCase ("userID") )  
  40.                     {  
  41.                         eventType = parser.next();  
  42.                         info.setUserID (parser.getText() );  
  43.                     }  
  44.                     else if (name.equalsIgnoreCase ("userName") )  
  45.                     {  
  46.                         eventType = parser.next();  
  47.                         info.setUserName (parser.getText() );  
  48.                     }  
  49.                     else if (name.equalsIgnoreCase ("reviewInfo") )  
  50.                     {  
  51.                         eventType = parser.next();  
  52.                         info.setReviewInfo (parser.getText() );  
  53.                     }  
  54.                     else if (name.equalsIgnoreCase ("reviewDate") )  
  55.                     {  
  56.                         eventType = parser.next();  
  57.                         info.setReviewDate (parser.getText() );  
  58.                     }  
  59.                     break;  
  60.                 case XmlPullParser.END_TAG:// 结束元素事件  
  61.                     if (parser.getName().equalsIgnoreCase ("Review") )  
  62.                     {  
  63.                         list.add (info);  
  64.                         info = null;  
  65.                     }  
  66.                     break;  
  67.                 }  
  68.                 eventType = parser.next();  
  69.             }  
  70.             inputStream.close();  
  71.         }  
  72.         catch (Exception e)  
  73.         {  
  74.             e.printStackTrace();  
  75.         }  
  76.         return list;  
  77.     }  
  78. }  
  79. </span>  
其实就是利用xmlpull解析xml,具体可以视需求而定。

调用的时候只需如下。

[java] view plaincopyprint?
  1. <span style="font-size:14px;">HttpConnSoap2 webservice = new HttpConnSoap2();  
  2. String methodName = "showReview";//方法名  
  3. ArrayList<String> paramList = new ArrayList<String>();  
  4. ArrayList<String> parValueList = new ArrayList<String>();  
  5. ArrayList<CommentInfor>() resultList = new ArrayList<CommentInfor>();  
  6.   
  7. paramList.add ("ID");//指定参数名  
  8. parValueList.add ("001");//指定参数值  
  9.   
  10. InputStream inputStream = webservice.GetWebServre (methodName, paramList, parValueList);  
  11. resultList = XMLParase.paraseCommentInfors (inputStream);</span>  

获取的所有的数据都在resultList中了。

再说一些小问题:

  • 有的同学反映说返回值是URL的时候结果很诡异。这个我没有遇到过,最好能给我LogCat,咱们一起研究一下。
  • 上面的方法一定不是完美的,只是说了一下思路,大家可以根据自己需要自行修改。当然直接拿来用的话问题也不大(没有专利费):D
  • 欢迎大家批评指正。
  • 有什么问题可以给我发邮件 bottle.liang@gmail.com
  • 也可以在下面留言。

PS:最好别要加QQ啊,QQ聊天的速度太快,我怕我一着急想不出来~~~

更重要的,回复和邮件可以装作没看见~(稍后回复),哈哈。

原创粉丝点击