• android程序中显示天气的web service例子


    一、获取并使用KSOAP包

    在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService。PC版本的WebService库非常丰 富,但这些对Android来说过于庞大。适合手机的WebService客户端的SDK有一些,比较常用的是KSOAP2。

    KSOAP2 地址:http://code.google.com/p/ksoap2-android/

    选择我们的项目,右键菜单中 Build Path –> Add External Archives… 增加这个下载的包

    image

    增加好后,我们在 选择我们的项目,右键菜单中 Build Path –> Configure Build Path 的 Libraries 中可以看到下面图:

    image

    二,分以下几步来调用 WebService

    1、指定 WebService 的命名空间和调用方法

    import org.ksoap2.serialization.SoapObject;
    private static final String NAMESPACE = "http://WebXml.com.cn/";
    private static final String METHOD_NAME = "getWeatherbyCityName";
    
    SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME);
    

    SoapObject类的第一个参数表示WebService的命名空间,可以从WSDL文档中找到WebService的命名空间。
    第二个参数表示要调用的WebService方法名。

    2、设置调用方法的参数值,如果没有参数,可以省略,设置方法的参数值的代码如下:

    rpc.addProperty("theCityName", "北京");
    

    要注意的是,addProperty方法的第1个参数虽然表示调用方法的参数名,但该参数值并不一定与服务端的WebService类中的方法参数名一致,只要设置参数的顺序一致即可。

    3、生成调用Webservice方法的SOAP请求信息。

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
    envelope.bodyOut = rpc;
    envelope.dotNet = true;
    envelope.setOutputSoapObject(rpc);
    

    创建SoapSerializationEnvelope对象时需要通过SoapSerializationEnvelope类的构造方法设置SOAP协议的版本号。
    该版本号需要根据服务端WebService的版本号设置。
    在创建SoapSerializationEnvelope对象后,不要忘了设置SOAPSoapSerializationEnvelope类的bodyOut属性,
    该属性的值就是在第一步创建的SoapObject对象。

    4、创建HttpTransportsSE对象。

    这里不要使用 AndroidHttpTransport ht = new AndroidHttpTransport(URL); 这是一个要过期的类

    private static String URL = "http://www.webxml.com.cn/webservices/weatherwebservice.asmx";
    HttpTransportSE ht = new HttpTransportSE(URL); 
    
    ht.debug = true;
    

    5、使用call方法调用WebService方法

    private static String SOAP_ACTION = "http://WebXml.com.cn/getWeatherbyCityName";
    ht.call(SOAP_ACTION, envelope);
    

    网上有人说这里的call的第一个参数为null,但是经过我的测试,null是不行的。
    第2个参数就是在第3步创建的SoapSerializationEnvelope对象。

    6、获得WebService方法的返回结果

    有两种方法:

    1、使用getResponse方法获得返回数据。

    private SoapObject detail;
    detail =(SoapObject) envelope.getResponse();
    

    2、使用 bodyIn 及 getProperty。

    private SoapObject detail;
    SoapObject result = (SoapObject)envelope.bodyIn;
    detail = (SoapObject) result.getProperty("getWeatherbyCityNameResult");
    

    7、 这时候执行会出错,提示没有权限访问网络

    需要修改 AndroidManifest.xml 文件,赋予相应权限

    简单来说就是增加下面这行配置:<uses-permission android:name="android.permission.INTERNET"></uses-permission>

    完整的 AndroidManifest.xml 文件 如下:

    注:Android 中在代码中为了调试写了system.out.print()输出项

    在菜单:Window-->show view-->other-->找到Android,选择Logcat 是可以看到输出的,
    如果你想在一个单独的窗口看到system.out.print()的输出的话,可以在logcat界面点那个绿色的“+”好,

    在Filter name 和 By log tag里面均填入System.out,这样的话你就能在单独的界面查看system.out.print()的输出了!!

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
            package="ghj1976.MyWeather" android:versionCode="1"
            android:versionName="1.0">
    
            <application android:icon="@drawable/icon" android:label="@string/app_name">
                    <activity android:name=".MyWeatherActivity" android:label="@string/app_name">
                            <intent-filter>
                                    <action android:name="android.intent.action.MAIN" />
                                    <category android:name="android.intent.category.LAUNCHER" />
                            </intent-filter>
                    </activity>
            </application>
            <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    
    </manifest>
    

    完整的代码如下:
    package com.duandian;
    import java.io.UnsupportedEncodingException;
    import org.ksoap2.SoapEnvelope;
    import org.ksoap2.serialization.SoapObject;
    import org.ksoap2.serialization.SoapSerializationEnvelope;
    import org.ksoap2.transport.AndroidHttpTransport;
    import org.ksoap2.transport.HttpTransportSE;
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.Toast;
    public class WeatherForcastActivity extends Activity {
       
     private static final String NAMESPACE = "http://WebXml.com.cn/"; 
     // WebService地址 
     private static String URL = "http://www.webxml.com.cn/webservices/weatherwebservice.asmx"; 
     private static final String METHOD_NAME = "getWeatherbyCityName"; 
     private static String SOAP_ACTION = "http://WebXml.com.cn/getWeatherbyCityName"; 
     private String weatherToday; 
     private EditText  et;
     private Button okButton; 
     private SoapObject detail; 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 
       okButton = (Button) findViewById(R.id.ok);
       et = (EditText) findViewById(R.id.et);
      
      
    //   et.setOnClickListener(new OnClickListener() {
    //  
    //  @Override
    //  public void onClick(View v) {
    //   // TODO Auto-generated method stub
    //   
    //  }
    // });
       okButton.setOnClickListener(new OnClickListener() { 
        public void onClick(View v) { 
         CharSequence edit_value = et.getText();
         String city = edit_value.toString();
         getWeather(city);
    //    showWeather(); 
        } 
       }); 
     } 
    // private void showWeather() { 
    //  et = (EditText) findViewById(R.id.et);
      
       
     
    // } 
     @SuppressWarnings("deprecation") 
     public void getWeather(String cityName) { 
     try { 
      System.out.println("rpc------"); 
       SoapObject rpc = new SoapObject(NAMESPACE, METHOD_NAME); 
       System.out.println("rpc" + rpc); 
       System.out.println("cityName is " + cityName); 
      rpc.addProperty("theCityName", cityName); 
     
      HttpTransportSE ht = new HttpTransportSE(URL);
    //   AndroidHttpTransport ht = new AndroidHttpTransport(URL); 
       ht.debug = true; 
     SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( 
         SoapEnvelope.VER11); 
       envelope.bodyOut = rpc; 
       envelope.dotNet = true; 
      envelope.setOutputSoapObject(rpc); 
       ht.call(SOAP_ACTION, envelope); 
      SoapObject result = (SoapObject) envelope.bodyIn; 
       detail = (SoapObject) result 
         .getProperty("getWeatherbyCityNameResult"); 
       System.out.println("result" + result); 
       System.out.println("detail" + detail); 
       Toast.makeText(WeatherForcastActivity.this, detail.toString(), 
        Toast.LENGTH_LONG).show(); 
       parseWeather(detail); 
       return; 
     } catch (Exception e) { 
       e.printStackTrace(); 
       } 
     } 
     private void parseWeather(SoapObject detail) 
        throws UnsupportedEncodingException { 
       String date = detail.getProperty(6).toString(); 
       weatherToday = "今天:" + date.split(" ")[0]; 
       weatherToday = weatherToday + "\n天气:" + date.split(" ")[1]; 
       weatherToday = weatherToday + "\n气温:" 
         + detail.getProperty(5).toString(); 
      weatherToday = weatherToday + "\n风力:" 
         + detail.getProperty(7).toString() + "\n"; 
       System.out.println("weatherToday is " + weatherToday); 
       Toast.makeText(WeatherForcastActivity.this, weatherToday,
       Toast.LENGTH_LONG).show(); 
      } 
    }
    main.xml 代码:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="请输入你要查询天气的城市"
        android:textSize="30sp"
        />
        <EditText
        android:id="@+id/et"
       android:layout_width="fill_parent"
      android:layout_height="50dp"
      android:text=""
        />
        <Button
        android:id="@+id/ok"
        android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="Ok"
        />
     </LinearLayout>
  • 相关阅读:
    C#线程锁使用全功略
    viewstate 与 session 区别
    Server.MapPath() 用法
    SQL Server 存储过程
    数据库索引的概念
    从C#程序中调用非受管DLLs
    [转载]C++、C#写的WebService相互调用
    解决WCF接口无法传递object参数的问题
    UTF-8,UTF-16
    js 验证字符串是否全为中文
  • 原文地址:https://www.cnblogs.com/myphoebe/p/2314784.html
Copyright © 2020-2023  润新知