加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

AndroidHttpTransport

发布时间:2020-12-17 00:57:02 所属栏目:安全 来源:网络整理
导读:上一节中我们通过http协议,采用HttpClient向服务器端action请求数据。当然调用服务器端方法获取数据并不止这一种。WebService也可以为我们提供所需数据, ?那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系

上一节中我们通过http协议,采用HttpClient向服务器端action请求数据。当然调用服务器端方法获取数据并不止这一种。WebService也可以为我们提供所需数据,

?那么什么是webService呢?,它是一种基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合到一起。

? 我们在PC机器java客户端中,需要一些库,比如XFire,Axis2,CXF等等来支持访问WebService,但是这些库并不适合我们资源有限 的android手机客户端,做过JAVA ME的人都知道有KSOAP这个第三方的类库,可以帮助我们获取服务器端webService调用,当然KSOAP已经提供了基于android版本的 jar包了,那么我们就开始吧:

?首先下载KSOAP包:ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar包

然后新建android项目:并把下载的KSOAP包放在android项目的lib目录下:右键->build path->configure build path--选择Libraries,如图:

以下分为七个步骤来调用WebService方法:

第一:实例化SoapObject 对象,指定webService的命名空间(从相关WSDL文档中可以查看命名空间),以及调用方法名称。如:

View Code
   
   
// 命名空间 private static final String serviceNameSpace = " http://WebXml.com.cn/ ; 调用方法(获得支持的城市) String getSupportCity getSupportCity ; 实例化SoapObject对象 SoapObject request new SoapObject(serviceNameSpace,getSupportCity);

第二步:假设方法有参数的话,设置调用方法参数

request.addProperty("参数名称","参数值");

第三步:设置SOAP请求信息(参数部分为SOAP协议版本号,与你要调用的webService中版本号一致):

View Code
获得序列化的Envelope
    
     SoapSerializationEnvelope envelope
    
     SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.bodyOut
    
    request;
   
   

第四步:注册Envelope,

?(new MarshalBase64()).register(envelope);

第五步:构建传输对象,并指明WSDL文档URL:

View Code
请求URL
    
     String serviceURL
    
    http://www.webxml.com.cn/webservices/weatherwebservice.asmx
    
    Android传输对象
    
     AndroidHttpTransport transport
    
     AndroidHttpTransport(serviceURL); transport.debug
    
    true
    
    ;
   
   

第六步:调用WebService(其中参数为1:命名空间+方法名称,2:Envelope对象):

View Code
transport.call(serviceNameSpace
    
    +
    
    getWeatherbyCityName,envelope);
   
   

第七步:解析返回数据:

View Code
if
    
    (envelope.getResponse()
    
    !=
    
    null
    
    ){ 
    
    return
    
     parse(envelope.bodyIn.toString()); }
    
    /**
    
    ************ * 解析XML * 
    
    @param
    
     str * 
    
    @return
    
    */
    
     List
    
    <
    
    String
    
    >
    
     parse(String str){ String temp; List
    
     list
    
     ArrayList
    
    (); 
    
    (str
    
    &&
    
     str.length()
    
    0
    
    int
    
     start
    
    str.indexOf(
    
    string
    
    ); 
    
     end
    
    str.lastIndexOf(
    
    ); temp
    
    str.substring(start,end
    
    -
    
    3
    
    ); String []test
    
    temp.split(
    
    for
    
    (
    
     i
    
    ;i
    
    test.length;i
    
    ++
    
    (i
    
    ==
    
    ){ temp
    
    test[i].substring(
    
    7
    
    ); }
    
    else
    
    { temp
    
    8
    
    ); } 
    
     index
    
    temp.indexOf(
    
    ,
    
    ); list.add(temp.substring(
    
     list; }
   
   

这样就成功啦。那么现在我们就来测试下吧,这里有个地址提供webService天气预报的服务的,我这里只提供获取城市列表:

View Code
//命名空间 private static final String serviceNameSpace="http://WebXml.com.cn/"; //请求URL private static final String serviceURL="http://www.webxml.com.cn/webservices/weatherwebservice.asmx"; //调用方法(获得支持的城市) private static final String getSupportCity="getSupportCity"; //调用城市的方法(需要带参数) private static final String getWeatherbyCityName="getWeatherbyCityName"; //调用省或者直辖市的方法(获得支持的省份或直辖市) private static final String getSupportProvince="getSupportProvince";
   
   

?然后你可以在浏览器中输入地址(WSDL):serviceURL,你会看到一些可供调用的方法:

?我们选择获取国内外主要城市或者省份的方法吧:getSupportProvice,然后调用,你会发现浏览器返回给我们的是xml文档:

View Code
<?
    
    xml version="1.0" encoding="utf-8" 
    
    ?>
    
     - 
    
    <
    
    ArrayOfString 
    
    xmlns:xsi
    
    ="http://www.w3.org/2001/XMLSchema-instance"
    
     xmlns:xsd
    
    ="http://www.w3.org/2001/XMLSchema"
    
     xmlns
    
    ="http://WebXml.com.cn/"
    
    >
    
    直辖市
    
    </
    
    特别行政区
    
    黑龙江
    
    吉林
    
    辽宁
    
    内蒙古
    
    河北
    
    河南
    
    山东
    
    山西
    
    江苏
    
    安徽
    
    陕西
    
    宁夏
    
    甘肃
    
    青海
    
    湖北
    
    湖南
    
    浙江
    
    江西
    
    福建
    
    贵州
    
    四川
    
    广东
    
    广西
    
    云南
    
    海南
    
    新疆
    
    西藏
    
    台湾
    
    亚洲
    
    欧洲
    
    非洲
    
    北美洲
    
    南美洲
    
    大洋洲
    
    ArrayOfString
    
    >
   
   

我们可以用 listview来显示:

那么下面我将给出全部代码:

View Code
public
    
    class
    
     WebServiceHelper { 
    
    WSDL文档中的命名空间
    
     String targetNameSpace
    
    WSDL文档中的URL
    
     String WSDL
    
    http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl
    
    需要调用的方法名(获得本天气预报Web Services支持的洲、国内外省份和城市信息)
    
     String getSupportProvince
    
    getSupportProvince
    
    需要调用的方法名(获得本天气预报Web Services支持的城市信息,根据省份查询城市集合:带参数)
    
    根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数
    
     String getWeatherbyCityName
    
    getWeatherbyCityName
    
    ****** * 获得州,国内外省份和城市信息 * 
    
     getProvince(){ List
    
     provinces
    
    (); String str
    
    ""
    
    ; SoapObject soapObject
    
     SoapObject(targetNameSpace,getSupportProvince); 
    
    request.addProperty("参数","参数值");调用的方法参数与参数值(根据具体需要可选可不选)
    
     SoapSerializationEnvelope(SoapEnvelope.VER11); envelope.dotNet
    
    ; envelope.setOutputSoapObject(soapObject);
    
    envelope.bodyOut=request;
    
     AndroidHttpTransport httpTranstation
    
     AndroidHttpTransport(WSDL); 
    
    或者HttpTransportSE httpTranstation=new HttpTransportSE(WSDL);
    
    try
    
     { httpTranstation.call(targetNameSpace
    
    getSupportProvince,envelope); SoapObject result
    
    (SoapObject)envelope.getResponse(); 
    
    下面对结果进行解析,结构类似json对象 
    
    str=(String) result.getProperty(6).toString();
    
     count
    
    result.getPropertyCount(); 
    
    ;index
    
    count;index
    
    ){ provinces.add(result.getProperty(index).toString()); } } 
    
    catch
    
     (IOException e) { 
    
     TODO Auto-generated catch block
    
     e.printStackTrace(); } 
    
     (XmlPullParserException e) { 
    
     provinces; } 
    
    ******** * 根据省份或者直辖市获取天气预报所支持的城市集合 * 
    
     province * 
    
     getCitys(String province){ List
    
     citys
    
    (); SoapObject soapObject
    
    byProvinceName
    
    ; envelope.setOutputSoapObject(soapObject); AndroidHttpTransport httpTransport
    
     { httpTransport.call(targetNameSpace
    
    getSupportCity,0)">){ citys.add(result.getProperty(index).toString()); } } 
    
     citys; } 
    
    ************************* * 根据城市信息获取天气预报信息 * 
    
     city * 
    
     **************************
    
     WeatherBean getWeatherByCity(String city){ WeatherBean bean
    
     WeatherBean(); SoapObject soapObject
    
    theCityName
    
    调用的方法参数与参数值(根据具体需要可选可不选)
    
    下面对结果进行解析,结构类似json对象
    
     bean
    
    parserWeather(result); } 
    
     bean; } 
    
     * 解析返回的结果 * 
    
     soapObject 
    
    protected
    
     WeatherBean parserWeather(SoapObject soapObject){ WeatherBean bean
    
     WeatherBean(); List
    
    Map
    
    String,Object
    
    >>
    
    (); Map
    
     map
    
     HashMap
    
    城市名
    
     bean.setCityName(soapObject.getProperty(
    
    1
    
    ).toString()); 
    
    城市简介
    
     bean.setCityDescription(soapObject.getProperty(soapObject.getPropertyCount()
    
    天气实况+建议
    
     bean.setLiveWeather(soapObject.getProperty(
    
    10
    
    ).toString()
    
    n
    
    soapObject.getProperty(
    
    11
    
    其他数据 
    
    日期,
    
     String date
    
    6
    
    ).toString(); 
    
    ---------------------------------------------------
    
     String weatherToday
    
    今天:
    
     date.split(
    
    )[
    
    ]; weatherToday
    
    +=
    
    n天气:
    
    n气温:
    
    5
    
    ).toString(); weatherToday
    
    n风力:
    
    ; List
    
    Integer
    
     icons
    
    (); icons.add(parseIcon(soapObject.getProperty(
    
    ).toString())); icons.add(parseIcon(soapObject.getProperty(
    
    9
    
    ).toString())); map.put(
    
    weatherDay
    
    icons
    
    -------------------------------------------------
    
    (); date
    
    13
    
    ).toString(); String weatherTomorrow
    
    明天:
    
    ]; weatherTomorrow
    
    12
    
    ).toString(); weatherTomorrow
    
    14
    
    ; icons
    
    15
    
    16
    
    --------------------------------------------------------------
    
    18
    
    ).toString(); String weatherAfterTomorrow
    
    后天:
    
    ]; weatherAfterTomorrow
    
    17
    
    ).toString(); weatherAfterTomorrow
    
    19
    
    20
    
    21
    
     bean.setList(list); 
    
    解析图标字符串
    
     parseIcon(String data){ 
    
     0.gif,返回名称0,0)"> resID
    
    32
    
    ; String result
    
    data.substring(
    
    4
    
    ).trim(); 
    
     String []icon=data.split("."); 
    
     String result=icon[0].trim(); 
    
     Log.e("this is the icon",result.trim());
    
    !
    
    result.equals(
    
    nothing
    
    )){ resID
    
    Integer.parseInt(result.trim()); } 
    
     resID; 
    
    return ("a_"+data).split(".")[0]; 
    
     } }
   
   

以及帮助类:

View Code
 WebServiceUtil { 
    
    调用城市的方法(需要带参数)
    
    调用省或者直辖市的方法(获得支持的省份或直辖市)
    
    *********** * @return城市列表 ************
    
     getCityList(){ 
    
    request; (
    
     MarshalBase64()).register(envelope); 
    
    调用
    
     { transport.call(serviceNameSpace
    
     parse(envelope.bodyIn.toString()); } } 
    
    ; } 
    
     getProviceList(){ 
    
    ; } } 
    
    *********** * 
    
     cityName * 
    
     ************
    
     String getWeather(String cityName){ 
    
     list; } 
    
    ******* * 获取天气 * 
    
    void
    
     parseWeather(SoapObject soapObject){ 
    
    String date=soapObject.getProperty(6);
    
     } }
   
   

以上就是我所作的查询天气预报的全部核心代码了,读者可以根据注释以及本文章了解下具体实现,相信很快就搞明白了,运行结果如下:

?到此结束,下一节主要是socket通信了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读