热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android直接写和读XML串方式调用WebServicesoap

http:sizeed.blog.163.comblogstatic9652545120111110105718361以如何根据一个手机号码获取号码归属地为例,详细地讲

http://sizeed.blog.163.com/blog/static/9652545120111110105718361/


以如何根据一个手机号码获取号码归属地为例,详细地讲解一下WebService的调用
这里使用的WebService提供站是
http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getMobileCodeInfo
我们用的是soap1.2协议,根据以上网页中的soap1.2实例来编写代码
SOAP 1.2
以下是 SOAP 1.2 请求和响应示例。所显示的占位符需替换为实际值。
POST /WebServices/MobileCodeWS.asmx HTTP/1.1
Host: webservice.webxml.com.cn
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length


 
   
      string
      string
   

 


HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length


 
   
      string
   

 


我们要发送的是一个post请求,完整的路径为
http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx
发送的数据为


 
   
      string
      string
   

 


为此我们要先写一个mobilesoap.xml文件,将第一个string改成手机号码(我们可以在xml文件中用占位符来表示),第二个string可以置空(表示免费用户)
将这些数据以http/post请求发送给服务器,服务器将返回一个响应,响应格式上面已经指出,通过解析响应的数据,就可以得到手机号码的归属地了
第一步,首先要读取我们自己定义的带有占位符的mobilesoap.xml文件


 
   
      $mobile
     
   

 


以上是mobilesoap.xml文件中的内容
private static String readSoapFile(InputStream inStream, String mobile) throws Exception{
byte[] data = StreamTool.readInputStream(inStream);
String soapxml = new String(data);
Map params = new HashMap();
params.put("mobile", mobile);
return replace(soapxml, params);
}
public static String replace(String xml, Map params)throws Exception{
String result = xml;
if(params!=null && !params.isEmpty()){
for(Map.Entry entry : params.entrySet()){
String name = "\\$"+ entry.getKey();
Pattern pattern = Pattern.compile(name);
Matcher matcher = pattern.matcher(result);
if(matcher.find()){
result = matcher.replaceAll(entry.getValue());
}
}
}
return result;
}
以上代码就可以根据mobilesoap.xml输入流以及mobile参数构造出完整的基于soap的http请求中的数据部分,将这些数据加上请求头发送给服务器,服务器就可以返回我们所需要的归属地数据了
public static String getMobileAddress(InputStream inStream, String mobile)throws Exception{
String soap = readSoapFile(inStream, mobile);
byte[] data = soap.getBytes();
URL url = new URL("http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx");
HttpURLConnection cOnn= (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setConnectTimeout(5 * 1000);
conn.setDoOutput(true);//如果通过post提交数据,必须设置允许对外输出数据
conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
conn.setRequestProperty("Content-Length", String.valueOf(data.length));
OutputStream outStream = conn.getOutputStream();
outStream.write(data);
outStream.flush();
outStream.close();
if(conn.getResponseCode()==200){
return parseResponseXML(conn.getInputStream());
}
return null;
}
       
private static String parseResponseXML(InputStream inStream) throws Exception{
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inStream, "UTF-8");
int eventType = parser.getEventType();//产生第一个事件
while(eventType!=XmlPullParser.END_DOCUMENT){//只要不是文档结束事件
switch (eventType) {
case XmlPullParser.START_TAG:
String name = parser.getName();//获取解析器当前指向的元素的名称
if("getMobileCodeInfoResult".equals(name)){
return parser.nextText();
}
break;
}
eventType = parser.next();
}
return null;
}
最后在我们的Activity就可以调用这些方法了,Activity简单界面如下
Android开发之如何调用WebService
图 1
为此我们将这些方法定义在MobileAddressService类里面,然后就可以调用了
public class MainActivity extends Activity {
    public static final String TAG = "MainActivity";
    private EditText txt_mobile;
    private Button btn_search;
    private TextView lab_mobile;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        txt_mobile = (EditText) findViewById(R.id.txt_mobile);
        btn_search = (Button) findViewById(R.id.btn_search);
        lab_mobile = (TextView) findViewById(R.id.mobile_address);
        btn_search.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String mobileNum = txt_mobile.getText().toString();
InputStream inStream = getClass().getClassLoader().getResourceAsStream("mobilesoap.xml");
try {
String mobileAddress = MobileAddressService.getMobileAddress(inStream, mobileNum);
lab_mobile.setText(mobileAddress);
} catch (Exception e) {
Toast.makeText(MainActivity.this, "获取归属地失败!", 1);
Log.e(TAG,"获取归属地失败!");
}
}
});
        
    }
}
至此,有关webservice调用阐述完毕!

 

 

 

另外一些代码:
Android中调用WebService的两种方法

第一种:使用KSOAP2库

原帖例子来自 http://www.cnblogs.com/ghj1976/archive/2011/04/26/2028904.html

这东西看起来好是好,可我最终还是以失败告终。

第一次崩溃是因为版本问题,主页上下载的最新2.5.7不知怎么搞的,编译没问题,一运行就程序崩溃。后来换成2.4的总算成功了。

第二次也不知道什么原因。例子能跑通,我自己的程序却死活不行,再次崩溃。

 

原帖分析的不错,copy一下。

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 文件,赋予相应权限

简单来说就是增加下面这行配置:

 

第二种方法 直接写和读XML串

原帖来自 http://hi.baidu.com/lbp0408/blog/item/7971ae10d229b30c203f2e12.html/cmtid/d50a2ff4ca6692e07709d7e7

挺好用,就是往WebService发一段符合要求的XML字符串,再读返回的XML字符串。

不过XML的解析还得费点功夫


view plain copy to clipboard print ?
final String SERVER_URL = "http://www.webxml.com.cn/webservices/weatherwebservice.asmx"; // 定义需要获取的内容来源地址  
  
URL url = new URL(SERVER_URL);  
URLConnection con = url.openConnection();  
con.setDoOutput(true);  
con.setRequestProperty("Pragma:", "no-cache");  
con.setRequestProperty("Cache-Control", "no-cache");  
con.setRequestProperty("Content-Type", "text/xml");  
  
OutputStreamWriter out = new OutputStreamWriter(con.getOutputStream());  
              
              
String xmlInfo = "\n"  
                             +"\n"  
                             +"\n"  
                             +"\n"  
                             +"beijing\n"  
                             +"\n"  
                             +"
\n"  
                             +"\n";  
Toast.makeText(this, xmlInfo, Toast.LENGTH_LONG).show();  
发送  
out.write(new String(xmlInfo.getBytes("UTF-8")));  
out.flush();  
out.close();  
// 取返回值   
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));  
StringBuilder sBuilder = new StringBuilder();  
String line = "";  
for (line = br.readLine(); line != null; line = br.readLine()) {  
        sBuilder.append(line);  
}

推荐阅读
  • GreenDAO快速入门
    前言之前在自己做项目的时候,用到了GreenDAO数据库,其实对于数据库辅助工具库从OrmLite,到litePal再到GreenDAO,总是在不停的切换,但是没有真正去了解他们的 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
author-avatar
手机用户2502929925
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有