rest 和 ksoap2 哪个更适合安卓2.3.5的微信

Web Servicek引擎kSOAP的使用教程
-------------
新增文件夹...
新增文件夹
(多个标签用逗号分隔)
对于J2ME访问远端的web Service,除了官方标准JSR 172,我们还有两种选择:
l Wingfoot
Wingfoot是由Wingfoot Software()出品的一款J2ME(CLDC/CDC) SOAP1.1的轻量级实现方案。
kSOAP是Enhydra.org的一个开源作品,是EnhydraME项目的一部分。基于Enhydra.org出品的开源通用XML解析器kXML,kSOAP完成了J2ME/MIDP平台上的SOAP解析和调用工作。
Stefan Haustein领导的kSOAP开发小组于日推出了Alhpa版本。之后又经过了一年的开发,日推出的kSOAP 1.2支持了SOAP1.2规范。日推出的kSOAP2,对SOAP序列化规范支持得更好了。
大多数人选择kSOAP的原因是,kSOAP虽然在2003年8月之后就不再维护了,但它是Open Source的,很容易加入增强特性,比如说默认情况下kSOAP2仅仅支持cmnet接入点,可以修改kSOAP2的HttpTransport.Java代码增加对cmwap接入点的支持。
下载提示:
kSOAP当前有两个版本:1.2和2.0。
项目主页:http://ksoap.objectweb.org/
kSOAP2.0还有一个优点是,改进了对Microsoft dotNET的兼容。以前有很多人抱怨kSOAP调用dotNET编写的Web Service时遇到了不少的困扰。
本章节我们将使用kSOAP 2.0的例子来讲解。
为了使用kSOAP 2.0,必须还要下载工具包kXML2。
下载提示:
kXML当前有两个版本:1.21和2.0。
项目主页:http://kxml.objectweb.org/
kXML2比kXML更小更快。
2.kSOAP2接口
让我们先熟悉一下即将用到的kSOAP2的常用接口。
org.ksoap2. SoapEnvelope
org.ksoap2. SoapSerializationEnvelope
org.ksoap2. SoapObject
org.ksoap2.transport. HttpTransport
SoapEnvelope对应于SOAP规范中的SOAP Envelope,封装了head和body对象。
SoapSerializationEnvelope是kSOAP2新增加的类,是对SoapEnvelope的扩展,对SOAP序列化(Serialization)格式规范提供了支持,能够对简单对象自动进行序列化(simple object serialization)。而kSOAP1.x则是通过org.ksoap.ClassMap来做序列化的,不太好操作,也不利于扩展。
SoapObject让你自如地构造SOAP调用;
HttpTransport为你屏蔽了Internet访问/请求和获取服务器SOAP的细节。
下面我们通过一个最简单的webservice调用,来看看kSOAP是如何做到SOAP解析的:
2.1.kSOAP和Web Service之间传递String
webservice传递String给MIDP是一件很简单的事情。首先在服务器端,不管你是用Microsft ASP.NET创建webservice,还是由tomcat+AXIS1.2支撑的webservice,都可以这么编写主服务类:
public class SimpleKSoapWS {
public SimpleKSoapWS () {
public String foo(String username, String password) {
return “fooResult”;
kSOAP是如何调用这个webservice的呢?
首先要使用SoapObject,这是一个高度抽象化的类,完成SOAP调用。可以调用它的addProperty方法填写要调用的webservice方法的参数。如下面代码所示:
SoapObject request& = new SoapObject(serviceNamespace, methodName);
SoapObject构造函数的两个参数含义为:
serviceNamespace – 你的webservice的命名空间,既可以是
http://localhost:8088/flickrBuddy/services/Buddycast这样的,也可以是
urn:PI/DevCentral/SoapService这样的;
methodName – 你要调用方法的名字。
然后,按照webservice方法参数的顺序,依次调用
request.addProperty( "username", "user" );
request.addProperty( "password", "pass" );
来填充webservice参数。
建议webservice的方法传递的参数尽量用string类型。即使是int类型,kSOAP2与Java编写的webservice也有可能交互发生异常。
对于webservice方法返回String类型的情况,还用不着开发者做序列化(Serialization)定制工作。
kSOAP 1.X/2.0可以自动把四种SOAP类型映射为Java类型
SOAP type Java type
xsd:int& java.lang.Integer
xsd:long& java.lang.Long
xsd:string& java.lang.String
xsd:boolean java.lang.Boolean
除此之外,都需要开发者自己做类型映射。
然后要告诉SoapSerializationEnvelope把构造好的SoapObject封装进去:
SoapSerializationEnvelope envelope =
new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut =
你可以通过SoapSerializationEnvelope或者SoapEnvelope的构造函数来指明你要用SOAP的哪一个规范,可以是以下几种之一:
常量SoapEnvelope.VER10:对应于SOAP 1.0规范
常量SoapEnvelope.VER11:对应于SOAP 1.1规范
常量SoapEnvelope.VER12:对应于SOAP 1.2规范
这样,无论要调用的webservice采用了哪一个SOAP规范,你都可以轻松应对。
接下来就要声明
HttpTransport tx = new HttpTransport(serviceURL);
ht.debug =
HttpTransport构造函数的参数含义为:
serviceURL – 要投递SOAP数据的目标地址,譬如说
/onca/soap3 。
HttpTransport是一个强大的辅助类,来完成Http-call transport process,它封装了网络请求的一切,你完全不用考虑序列化消息。我们通过设置它的debug属性为true来打开调试信息。
方法HttpTransport.call()自己就能够发送请求给服务器、接收服务器响应并序列化SOAP消息,如下所示:
ht.call(null, envelope);
HttpTransport的call方法的两个参数含义为:
soapAction – SOAP 规范定义了一个名为 SOAPAction 的新 HTTP 标头,所有 SOAP HTTP 请求(即使是空的)都必须包含该标头。 SOAPAction 标头旨在表明该消息的意图。通常可以置此参数为null,这样HttpTransport就会设置HTTP标头SOAPAction为空字符串。
Envelope – 就是前面我们构造好的SoapSerializationEnvelope或SoapEnvelope对象。
对于HttpTransport的处理上,kSOAP2和kSOAP1.2的写法不一样。
对于kSOAP 1.2,HttpTransport的构造函数是HttpTransport (String url, String soapAction),第二个参数soapAction可以是要调用的webservice方法名。
而kSOAP 2,构造函数是 HttpTransport(String url)。kSOAP2相当于把webservice方法名分离出去,完全交给SoapObject去封装,而HttpTransport仅仅负责把SoapEnvelope发送出去并接收响应,这样更合理一些。
调用call方法是一个同步过程,需要等待它返回。
返回之后,就可以调用SoapSerializationEnvelope的getResult方法来获取结果了:
Object Response = envelope.getResult();
如果HttpTransport的debug属性为true,那么此时就可以通过
System.out.println("Response dump&&" + tx.responseDump);
打印出HttpTransport的调试信息。尤其当前面call方法和getResult方法发生异常时,这个调试信息是非常有用的。
前面我们的webservice方法由于是返回string,所以得到这个string值就非常简单了:
String sResponse = (String)R
由于HttpTransport类实际上是调用了HttpConnection作网络连接,所以必须另起一个线程来专门做kSOAP工作,否则会堵塞操作。
综上所述,J2ME客户端的MIDlet按键事件函数这么写即可:
MIDlet codes
import org.ksoap2.SoapE
import org.ksoap2.serialization.SoapO
import org.ksoap2.serialization.SoapSerializationE
import org.ksoap2.transport.HttpT
public void commandAction(Command c, Displayable s) {
if (c == exitCommand)
destroyApp(false);
notifyDestroyed();
if (c == connectCommand)
// 匿名内部Thread,调用kSOAP2访问远程服务。
Thread webserviceThread = new Thread()
public void run(){
String serviceNamespace =
"http://localhost:8080/SimpleWS/services/SimpleKSoapWS";
String methodName = "foo";
String serviceURL =
"http://localhost:8080/SimpleWS/services/SimpleKSoapWS";
SoapObject request =
new SoapObject(serviceNamespace, methodName);
request.addProperty( "username", "user" );
request.addProperty( "password", "pass" );
SoapSerializationEnvelope envelope =
new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut =
HttpTransport tx = new HttpTransport(serviceURL);
ht.debug =
ht.call(null, envelope);
Object Response = envelope.getResult();
* 必要时打印出tx.responseDump来观察soap是否正确工作
System.out.println("dump&&" + tx.responseDump);
String sResponse = (String)R
catch (Exception e) {
e.printStackTrace ();
webserviceThread.start();
2.2.webservice返回复杂描述的情况
kSOAP2处理webservice简单的string类型返回值是很容易的。那么如何处理像亚马逊网上书店这种webservice返回的复杂描述呢?
kSOAP2自带了一个例子来说明,下面我们就讲解一下。
关于亚马逊的查询书目的webservice,你可以通过
/schemas3/AmazonWebServices.wsdl
来获知定义。
我们要关注的是它的关键词查询请求的方法,它的定义是:
&operation name="KeywordSearchRequest"&
&soap:operation soapAction="" /&
&soap:body use="encoded"
encodingStyle=http://schemas.xmlsoap.org/soap/encoding/ namespace="" /&
&soap:body use="encoded"
encodingStyle=http://schemas.xmlsoap.org/soap/encoding/ namespace="" /&
&/operation&
我们提交对包含指定关键词的书目查询,如果查询成功,将会返回一系列书名节点,每一本书都提供了作者、出版社、出版日期、价格等等信息。这些书名节点都在一个“Details”节点下。查询结果的总数放在TotalResults节点。每页10个结果,可以通过查看TotalPages节点来确定需要多少页。
那么,kSOAP2可以很简单地通过SoapObject的getProperty方法来得到书详细信息的节点,存储入一个Vector对象中,如下所示:
HttpTransport ht = new HttpTransport("/onca/soap3");
ht.call(null, envelope);
SoapObject result = (SoapObject) envelope.getResult();
Vector resultVector = (Vector) result.getProperty("Details");
Vector对象中实际上还是存储了一组SoapObject对象,这里的每一个SoapObject对象对应于一本书的DOM对象。
那么如何得到每一本书的书名、价格呢?
for(int i = 0; i & resultVector.size(); i++){
SoapObject detail = (SoapObject) resultVector.elementAt(i);
System.out.println("书名&&"+(String) detail.getProperty("ProductName"));
System.out.println("日期&&"+(String) detail.getProperty("ReleaseDate"));
System.out.println("价格&&"+(String) detail.getProperty("ListPrice"));
这样就可以了。
需要注意的是,要测试这个工程,必须到亚马逊的/webservice 注册获取Access Key ID,也就是webservice方法中的“devtag”参数所需要的Developer-Tag。
2.3.webservice传递自定义复杂对象
下面我们讲述如何在MIDP设备和webservice之间传递自定义类,比如这个类中不但有String类型成员变量,还有Vector之类的复杂类型。
大致思路就是,在服务器端将类实例按照一定规格(一个一个的成员变量写)序列化为byte[],将这个byte[]数组返回给kSOAP2。kSOAP2收到之后,再反序列化,将byte[]一段一段地读入类实例。
2.3.1.webservice服务器端的做法
我们先来定义要传递的wsTeam类:
public class wsTeam{
private String wsReturnC
private String wsPersonC
public StringVector wsvPersonN
public byte[] serialize();
public static wsTeam deserialize(byte[] data) ;
其中,StringVector类是另外一个自定义类,就是简单地把String[]封装了一下,便于操作。StringVector类定义在示范代码中可以找到。
服务器端主要是序列化,所以我们来讲讲wsTeam的serialize()函数。
wsTeam的序列化函数
public byte[] serialize() {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
dos.writeUTF(wsReturnCode);
dos.writeUTF(wsPersonCount);
wsvPersonName.writeObject(dos);
baos.close();
dos.close();
catch(Exception exc)
exc.printStackTrace();
return baos.toByteArray();
这样,类实例就可以把自己序列化为byte[]数组。
那么,webservice可以这么提供:
public class SimpleKSoapWS {
public SimpleKSoapWS () {
public byte[] foo2(String username, String password) {
wsTeam obj= new wsTeam ();
return obj.serialize();
到了MIDP设备上,要能够从byte[]恢复出wsTeam类实例才行。
StringVector的序列化方法writeObject也很简单,先写入字符串数组的大小,然后再将每一个元素写入,如下所示:
StringVector的序列化
public class StringVector
public synchronized void writeObject(java.io.DataOutputStream s)
throws java.io.IOException
// Write out array length
s.writeInt(count);
// Write out all elements in the proper order.
for (int i=0; i& i++)
s.writeUTF(data[i]);
2.3.2.MIDP设备的做法
和前面的MIDlet代码差不多,只不过要kSOAP2的MarshalBase64出场了。
在kSOAP中,我们用Base64把二进制流编码为ASCII字符串,这样就可以通过XML/SOAP传输二进制数据了。
org.ksoap2.serialization.MarshalBase64的目的就是,把SOAP XML中的xsd:based64Binary元素序列化为Java字节数组(byete array)类型。类似的,kSOAP2还提供了MarshalDate、MarshalHashtable类来把相应的元素序列化为Java的Date、Hashtable类型。
使用MarshalBase64
import org.ksoap2.serialization.MarshalBase64;
SoapObject request = new SoapObject(serviceNamespace, methodName );
SoapSerializationEnvelope envelope =
new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut =
new MarshalBase64().register(envelope);
HttpTransport tx = new HttpTransport(serviceNamespace);
tx.debug =
tx.call(null, envelope);
Object Response = envelope.getResult();
将接收到的SoapObject强制转换为byte[]。
byte[] by = (byte[])R
System.out.println("succ convert!");
然后,再调用
wsTeam wc = wsTeam.deserialize(by);
这样,在无线设备上就得到了wsTeam类实例了。
wsTeam的deserialize函数是这么定义的:
wsTeam的反序列化函数
public class StringVector
public static wsTeam deserialize(byte[] data) {
ByteArrayInputStream bais = new ByteArrayInputStream(data);
DataInputStream dis = new DataInputStream(bais);
wsTeam wc = new wsTeam();
wc.wsReturnCode = dis.readUTF();
wc.wsPersonCount = dis.readUTF();
wc. wsvPersonName.readObject(dis);
bais.close();
dis.close();
catch(Exception exc)
exc.printStackTrace();
StringVector的反序列化方法readObject也很简单,先读入字符串数组的大小,就自行新建一个同样大小的字符串数组,然后再将每一个元素写入这个数组,如下所示:
StringVector的反序列化
public class StringVector
public synchronized void readObject(java.io.DataInputStream s)
throws java.io.IOException, ClassNotFoundException
// Read in array length and allocate array
int arrayLength = s.readInt();
data = new String[arrayLength];
// 同步data的大小
count = arrayL
// Read in all elements in the proper order.
for (int i=0; i&arrayL i++)
data[i] = s.readUTF();
通过上面的反序列化,我们就可以通过
for (int i=0; i&wc.wsvPersonName.size(); i++) {
System.out.println("第" + i +"个人:" +
wc.wsvPersonName.getStringAt(i));
来打印MIDlet上收到的类对象中的StringVector成员变量了。
利用kSOAP2提供的框架,你可以在无线设备和Internet webservice之间,既可以传递简单的数值,也可以传递各种各样的类对象。
转自:/ice4c/archive/.html
相关资讯  — 
相关文档  — 
发布时间: 17:23:06
同类热门经验
29914次浏览
20091次浏览
10308次浏览
16324次浏览
10857次浏览
10456次浏览
OPEN-OPEN, all rights reserved.我打电话是在我的Android应用程序的Web服务和为getGramaNiladhariData(),
我得到的结果作为SoapObject。
result = (SoapObject) envelope.bodyIn; Log.d("WS", String.valueOf(result));
这是我得到的将String.valueOf(结果)
getGramaNiladhariDataResponse {getGramaNiladhariDataResult={anyType的地址=anyType的{}; workingDays=anyType的{}; gnDivision=anyType的{}; contactNumber=anyType的{};}}
在这里,我打电话返回对象,包括5个属性。
因为我发现在我不能得到一个soap作为对象的哪些返回object.If所以,我应该如何获取值的结果。
我想解决的是为什么我收到anyType的{},作为值,而不是实际值。
任何帮助,将不胜感激
本文地址 :CodeGo.net/501544/
-------------------------------------------------------------------------------------------------------------------------
1. 其来不及回答。但FYI和其他人谁找到
通过这样做String.valueOf(result)您要打印的身体的全部内容。但为了得到你首先你需要打的纠正SoapObject。
我不知道是否有任何简单的方法来找到正确的SoapObject,但还是这样做的伎俩,一旦你得到了正确的SoapObject那么你做。在下面找到如何找到正确的SoapObject,
首先,你需要检查PARAMS计数在你的优先个SoapObject,
result.getPropertyCount();
你会得到数较少量为这个,因为这是优先个盖 CodeGo.net,
然后,打印并查看哪些参数给你corect细节,
result.getProperty(0);
result.getProperty(1);
一旦你找到了正确的然后抓住那SoapObject。这样,
SoapObject result2 = (SoapObject) result.getProperty(0);
然后检查此对象的计数。并做如上,直到你得到正确的SoapObject。
一旦你找到的最后一个SoapObject它会打印这样的字符串,
anyType{gnName = P address = A ; workingDays = 5; gnDivision = C contactNumber = }
现在你可以像这样这个对象继续前进,
SoapObject result3 = (SoapObject) result2.getProperty(5);
Log.v("Name : ", result3.getProperty("gnName").toString());
你会得到的输出在DDMS象下面这样,
Name : Prasad
我想这会帮助你,知道,如果您有任何进一步的问题。
我以前有这个问题。我解决了它。我以前有这个问题。我解决了它。我花了很多找到一个解决这个问题。我的项目它的工作。我创建的Web服务.NET对象数组。我希望这会帮助你。
//.................................
SoapObject requestx = new SoapObject(NAMESPACE, METHOD_NAME);
SoapSerializationEnvelope envelopex = new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelopex.dotNet =
envelopex.setOutputSoapObject(requestx);
HttpTransportSE httpTransportx = new HttpTransportSE(URL);
httpTransportx.call(SOAP_ACTION, envelopex);
SoapObject responsex = (SoapObject)envelopex.getResponse(); // not envelopex.bodyIn;
int RCount=responsex.getPropertyCount();
int[] tbIDArray = new int[RCount+1];
int[] iMonthAarray = new int[RCount+1];
int[] iYearAarray = new int[RCount+1];
String[] sDetailAarray = new String[RCount+1];
for (i = 0; i & RC i++) {
Object property = responsex.getProperty(i);
if (property instanceof SoapObject) {
SoapObject info = (SoapObject)
String tbID = info.getProperty("tbID").toString();
String iMonth = info.getProperty("iMonth").toString();
String iYear = info.getProperty("iYear").toString();
String sDetail = info.getProperty("sDetail").toString();
tbIDArray[i] =Integer.valueOf(tbID);
iMonthAarray[i] =Integer.valueOf(iMonth);
iYearAarray[i] =Integer.valueOf(iYear);
sDetailAarray[i] =sD
}//if (property instanceof SoapObject) {
}//for (i = 0; i & RC i++) {
} catch (Exception exception) {
MsgBox1(exception.toString() , "Error");
本文标题 :重新调整一个复杂类型对象时SoapObject结果返回anyType的{}作为值
本文地址 :CodeGo.net/501544/
Copyright (C) 2014 CodeGo.net 沪ICP备号 联&系& c&o&d&e&g&o &@&1&2&6&.&c&o&mGoogle为Android平台开发Web Service客户端提供了ksoap2-android项目,在这个网址下载开发包
使用 kspoap2-android调用webserice操作的步骤如下:
& 1、创建HttpTransportSE传说对象 传入webservice服务器地址
final&HttpTransportSE&httpSE&=&new&HttpTransportSE(SERVER_URL);&&
& 2、 创建SoapObject对象,创建该对象时需要传入所要调用Wb Service的命名空间、Web Service方法名;如果有参数要传给Web Service服务器,调用SoapObject对象的addProperty(String name,Object value)方法来设置参数,该方法的name参数指定参数名;value参数指定参数值
SoapObject&soapObject&=&new&SoapObject(PACE,&M_NAME); &
soapObject.addProperty("byProvinceName&",&citys);&&
3、创建SoapSerializationEnelope对象,并传入SOAP协议的版本号;并设置对象的bodyOut属性
final&SoapSerializationEnvelope&soapserial&=&new&SoapSerializationEnvelope(&&
&&&&&&&&&&&&SoapEnvelope.VER11);&&
&&&&soapserial.bodyOut&=&soapO&&
&&&&soapserial.dotNet&=&true;&&
& 6、调用HttpTransportSE对象的call()方法,其中call的第一个参数soapAction,第二个为SoapSerializationEvelope对象 调用远程Web Service;
&&&httpSE.call(PACE&+&M_NAME,&soapserial);&&
& &7、获取返回的信息,并解析
SoapObject&result&=&(SoapObject)&soapserial.bodyIn;&&
SoapObject&detail&=&(SoapObject)&result.getProperty("getSupportProvinceResult");&&
for&(int&i&=&0;&i&&&detail.getPropertyCount();&i++)&{&&
citys.add(detail.getProperty(i).toString());&&
实例:通过天气预报 Web 服务&.cn/WebServices/WeatherWebService.asmx来获取联动城市
阅读(...) 评论()WebService+ksoap2天气查询源码 - 安卓源码下载 - A5源码
关键字:    
当前位置: >
WebService+ksoap2天气查询源码
详细介绍 - [ WebService+ksoap2天气查询源码 ]
WebService+ksoap2天气查询源码是学习WebService调用和ksoap2使用的最佳源码。
下载地址 - [ WebService+ksoap2天气查询源码 ]
推荐使用、下载,请使用解压文件;
下载本站资源,如服务器暂不能下载请过一段时间再试;
本站资源通过 、 等软件检测;
本站部分资源供学习交流使用,如商业用途,请购正版。
网友对“WebService+ksoap2天气查询源码”的评论
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
上一篇: & 下一篇:
您喜欢这个源码么?
本类热门源码
增值电信业务经营许可证:苏B2-CopyRight ©
All Rights reserved.

我要回帖

更多关于 安卓2.3.4适合的微信 的文章

 

随机推荐