不过网上这个例子有些没有说明,有些情况不一样了,所以我重新写了。
一、获取并使用KSOAP包
在Android
SDK中并没有提供调用WebService的库,因此,需要使用第三方的SDK来调用WebService。PC版本的WebService库非常丰富,但这些对Android来说过于庞大。适合手机的WebService客户端的SDK有一些,比较常用的是KSOAP2。
我下载的最新的是: ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar
注意:
我在使用ksoap2-android时犯了一个低级错误:使用时报错误:The import org.ksoap2 cannot be
resolved。
当时分析这个问题时一直以为是Eclipse出了问题,找了好多方法都不行,
实际是我下载的ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar文件是错误的导致的,走了弯路。
选择我们的项目,右键菜单中 Build Path –> Add External Archives… 增加这个下载的包
增加好后,我们在 选择我们的项目,右键菜单中 Build Path –> Configure Build Path 的 Libraries
中可以看到下面图:
二,分以下几步来调用 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);
这是一个要过期的类
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 文件,赋予相应权限
简单来说就是增加下面这行配置:
完整的 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()的输出了!!
@drawable/icon"
android:label="@string/app_name">
.MyWeatherActivity"
android:label="@string/app_name">
android.intent.action.MAIN"
/>
android.intent.category.LAUNCHER"
/>
android.permission.INTERNET">
完整的代码如下:
package ghj1976.MyWeather;
import java.io.UnsupportedEncodingException;
import android.app.Activity;
import android.os.Bundle;
import
android.view.View;
import android.widget.Button;
import
android.widget.Toast;
import org.ksoap2.SoapEnvelope;
import
org.ksoap2.serialization.SoapObject;
import
org.ksoap2.serialization.SoapSerializationEnvelope;
//import
org.ksoap2.transport.AndroidHttpTransport;
import
org.ksoap2.transport.HttpTransportSE;
public class MyWeatherActivity extends Activity {
private Button okButton;
/** Called when the activity is first created. */
@Override
public
void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
okButton
= (Button)
this.findViewById(R.id.btn_Search);
okButton.setOnClickListener(new
Button.OnClickListener() {
@Override
public void onClick(View v)
{
String city = "北京";
getWeather(city);
}
});
}
private static final String METHOD_NAME = "getWeatherbyCityName";
private String weatherToday;
private SoapObject detail;
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);
SoapSerializationEnvelope envelope = new
SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut =
rpc;
envelope.dotNet =
true;
envelope.setOutputSoapObject(rpc);
HttpTransportSE ht =
new HttpTransportSE(URL);
//AndroidHttpTransport ht = new
AndroidHttpTransport(URL);
ht.debug = true;
ht.call(SOAP_ACTION, envelope);
//ht.call(null, envelope);
//SoapObject result = (SoapObject)envelope.bodyIn;
//detail =
(SoapObject) result.getProperty("getWeatherbyCityNameResult");
detail =(SoapObject)
envelope.getResponse();
//System.out.println("result" +
result);
System.out.println("detail" + detail);
Toast.makeText(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(this, weatherToday,
Toast.LENGTH_LONG).show();
}
}
参考资料
分享到:
相关推荐
NULL 博文链接:https://topmanopensource.iteye.com/blog/1290498
xfire开发webservice以及Android利用ksoap2访问webservice。包括源码和jar包
在Android 中使用KSOAP2调用WebService.docx
使用ksoap2调用Webservice实例 需将lib文件夹设置为源文件夹 在AndroidManifest.xml文件中加入<uses-permission android:name="android.permission.INTERNET" />
Android通过Ksoap2访问dotNet_WebService
Android基于ksoap2的WebService通信客户端demo
android 利用ksoap调用webservice工具
ANDROID使用KSOAP2 开发 ,使用.NET开发的WEBSERVICE
,android用ksoap2调用webservice接口查询,导入能直接运行
一个简单封装好的小型使用ksoap2进行WebService的android小型demo,根据其中的README.txt文档可以直接对其中进行修改
Android中ksoap2-android调用WebService 实现天气预报,4.0版本好像不能运行,但是可以参考学习。
简述在android中使用ksoap2调用webservice的方法
Android通过Ksoap2链接WebService上传图片的功能
android client ksoap2 token apache cxf wss4j authentication
这个是android webservice所需要的jar包,这个是3.6版本,应该是比较新的
ksoap2-webservice-demo demo内容包括android端与web服务端 >在NetSetting.java文件中修改所需的方法参数,将其中的WEB_SERVICE_URL修改成为自己的url。之后对demo中的Request方法进行重写即可 博客地址:...
ksoap 3.6.2访问webservice封装库 引用modules可直接使用
对学习android ksoap开源包来访问微博service,来说是一个非常好的demo.
在Android SDK中并没有提供调用WebService的库,因此,需要使用第三方类库(KSOAP2)来调用WebService。本文将介绍在Android 中调用WebService的具体细节,并在最后给出一个完整的例子来演示如何使用KSOAP2来调用...
Android通过Ksoap包的方法 调用了 .net webserivce