webService的调用

今天弄了一天的webservice的调用。。。我真是身心都疲惫了。。。菜鸟有菜鸟说不尽的苦。。。还是先说说我今天的成果把!

 首先工程要引用一个ksoap2-android-assembly-2.5.4-jar-with-dependencies.jar包

最要的是NAMESPACE   METHOD_NAME   URL   这三个常理;

NAMESPACE   是表示命名空间  也就是getWeatherbyCityName这个方法所在的命名空间  

具体的值可以在利用http://www.webxml.com.cn/webservices/weatherwebservice.asmx?wsdl进入 

 

而METHOD_NAME  也就是你要请求的那个方法

 

 

privatestaticfinal String NAMESPACE ="http://WebXml.com.cn/";


// WebService地址
privatestatic String URL ="http://www.webxml.com.cn/
webservices/weatherwebservice.asmx";


privatestaticfinal String METHOD_NAME ="getWeatherbyCityName";


//SOAP_ACTION 就等于 NAMESPACE +METHOD_NAME
privatestatic String SOAP_ACTION ="http://WebXml.com.cn/
getWeatherbyCityName";

//指定webservice的命名空间和调用的方法名
SoapObject soapObject=new SoapObject(NAMESPACE , METHOD_NAME );
soapObject=new .addProperty("theCityName", "武汉");

//生成调用Webservice方法的SOAP请求信息。该信息由SoapSerializationEnvelope对象描述
SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
envelope.bodyOut=soapObject;
envelope.dotNet=true;
envelope.setOutputSoapObject(soapObject);

//创建HttpTransportsSE对象。通过HttpTransportsSE类的构造方法可以指定WebService的WSDL文档的URL:
HttpTransportSE transport=new HttpTransportSE(URL);
transport.debug=true;

String s="";
try {
transport.call("http://tempuri.org/QueryCustomer",envelope);
s= envelope.bodyIn.toString();
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
System.out.println(s);

 

 

org.xmlpull.v1.XmlPullParserException:expected
说服务端不识别这稳中有种xml如何解决?

1.ht.call(SOAP_ACTION, envelope); //当SOAP_ACTION为空时会抛出
所以最好SOAP_ACTION不要为空
2.rpc.addProperty("theCityName", cityName); 这里的theCityName 跟接口上的名称不一样也会抛出
3.SoapSerializationEnvelope envelope=new SoapSerializationEnvelope(SoapEnvelope.VER11);
最让人蛋疼的是这里。。。这里本人水平有限无法从其它地方得到这东西。。。只能告诉你们从VER10一直试到VER12。。如果其它地方没错的话那一定会找到正确的

 

 

最后我在http://jnshilang.iteye.com/blog/1628218看到了
两种方式获取服务器返回的信息
envelope.getResponse();

envelope.bodyIn;
两者的区别:Webservice开发的时候一般情况下大家接受webservice服务器返回值的时候都是使用
SoapObject soapObject = (SoapObject) envelope.getResponse();这个来接受返回
来的值,但这种方法往往会产生java.lang.ClassCastException: org.ksoap2.
serialization.SoapPrimitive这样的错误。
在服务器端返回值是String类型的数值的时候使用SoapObject soapObject = (SoapObject)
envelope.getResponse()会产生java.lang.ClassCastException: org.ksoap2.
serialization.SoapPrimitive这样的错误。
使用SoapObject result = (SoapObject)envelope.bodyIn和 Object object =
envelope.getResponse();就可以解决这种错误。 如果服务器返回值的类型是byte[] 的时候, 使用Object object = envelope.getResponse();和SoapObject result = (SoapObject)envelope.bodyIn;
都不会发生错误现象,但是在使用Object object = envelope.getResponse();
取回来的值在使用base64进行解码和编码的时候会报出错误。如果使用SoapObject result = (SoapObject)envelope.bodyIn;
就可以完整的将byte[]进行解码和编码,byte[] ops = Base64.decode(result.getProperty(0).toString());
SoapObject result=(SoapObject) envelope.bodyIn;
String str=result.getProperty(0).toString();
或者是
Object result= (Object) reqVo.envelope.getResponse();
String str=result.toString()

 

如果是android 就要加 <uses-permission android:name="android.permission.INTERNET"/>能得到数据.

 

虽然东西比较少,但今天还是有收获的。

今日之思 非我所想

今日之事 非我所愿

今日之言 非我所意

posted @ 2014-04-02 21:41  看天鹅的蛤蟆  阅读(367)  评论(0编辑  收藏  举报