什么是webservice?

Web service是一个平台独立的,低耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准通用标记语言下的一个子集)标准描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。Web   Service所使用的是Internet上统一、开放的标准,如HTTP、XML、SOAP(简单对象访问协议)、WSDL(webservice描述语言)等,所以Web   Service可以在任何支持这些标准的环境(Windows,Linux)中使用。(说白了,webService就像是一个方法,只不过不是你自己写的,而且是跨语言、跨平台的。我们只需要调用这个方法获得返回结果即可。至于webservice怎么运行的与调用端是无关的,也不需要知道)

注:SOAP协议(Simple   Object   Access   Protocal,简单对象访问协议),它是一个用于分散和分布式环境下网络信息交换的基于XML的通讯协议。在此协议下,软件组件或应用程序能够通过标准的HTTP协议进行通讯。它的设计目标就是简单性和扩展性,这有助于大量异构程序和平台之间的互操作性,从而使存在的应用程序能够被广泛的用户访问。

为什么要使用webservice?

方便并且开放。大家都知道,在手机上的cpu和内存等条件是很有限的,尤其是处理一些大数据等易耗损资源的操作都会非常吃力甚至根本就不行。因此,将这一部分的处理交给服务器端,让服务器来处理这些数据。那么在服务器端我们就可以实现一个webservice让我们在客户端来调用,返回我们需要的数据即可。

什么时候使用webservice?

只要是数据交换都可以使用。但是对webservice的优劣要有认识:

优点:

  1. 跨平台、跨语言;
  2. SOAP协议是基于XML和HTTP这些业界的标准的,得到了所有的重要公司的支持。
  3. 由于使用了SOAP,数据是以ASCII文本的方式而非二进制传输,调试很方便;并且由于这样,它的数据容易通过防火墙,不需要防火墙为了程序而单独开一个“漏洞”。
  4. WebService实现的技术难度要比CORBA和DCOM小得多。
  5. 要实现B2B集成,EDI比较完善与比较复杂;而用WebService则可以低成本的实现,小公司也可以用上。
  6. 在C/S的程序中,WebService可以实现网页无整体刷新的与服务器打交道并取数。

缺点:

  1. WebService使用了XML对数据封装,会造成大量的数据要在网络中传输。
  2. WebService规范没有规定任何与实现相关的细节,包括对象模型、编程语言,这一点,它不如CORBA 。

怎么使用webservice?(整个过程我们用一个获取手机号归属地的例子来说明)

要使用webservice就必须知道webservice的接口文档,即WSDL(webservice描述服务)。那么,WSDL究竟长成什么样子呢?

下面我给出了一个链接:(该链接打开就是一个WSDL)

http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl

打开后如下图所示:(未显示完整)

家一看就傻眼了吧,怎么多的信息,到底哪些是我们需要的呢?

其实,我们调用webservice只需要三个数据即可:命名空间、方法名称(包括方法名和参数类型)、根节点。

那么WSDL上对应的数据在哪里呢?

根节点即是上面给出的链接去掉“?wsdl”:http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx

命名空间、方法名称(包括方法名和参数类型)在下图中依次为从上到下,从左到右。

好了,知道了这些。我们就可以开始开工了。

首先,我们需要下载一个ksoap2jar包,它是我们调用webservice的工具类,在此给出一个下载地址:http://download.csdn.net/detail/af74776/7735251

下载好jar包后导入进项目中(先复制到libs文件夹下,点击jar包,单击右键,选择build path ,然后选择add External Archives。然后,单击工程项目,单击右键,选择build path ,再选择configure build pathxxxxx。在弹出的对话框的右侧,选择Order and Export选项卡。在刚刚添加的ksoap2 jar包前打钩,然后选择ok即可)

如下:

成功导入包后,便可开始编写代码了(哎,直接上代码吧。代码上有详细的注解):

布局文件activity_web_service.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:paddingLeft="5dip"
android:paddingRight="5dip"
android:paddingTop="5dip" > <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="手机号码(段):" /> <EditText
android:id="@+id/phone_sec"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="例如:1398547"
android:inputType="textPhonetic"
android:singleLine="true" /> <Button
android:id="@+id/query_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:text="查询" /> <TextView
android:id="@+id/result_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|center_vertical" /> </LinearLayout>

WebServiceActivity.java:

package com.example.helloandroid;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
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 WebServiceActivity extends Activity {
private EditText phoneSecEditText;
private TextView resultView;
private Button queryButton;
String result;
private String phoneSec; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_service);
phoneSecEditText = (EditText) findViewById(R.id.phone_sec);
resultView = (TextView) findViewById(R.id.result_text);
queryButton = (Button) findViewById(R.id.query_btn); queryButton.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
phoneSec = phoneSecEditText.getText().toString().trim();
// 简单判断用户输入的手机号码(段)是否合法
if ("".equals(phoneSec) || phoneSec.length() < 7) {
// 给出错误提示
phoneSecEditText.setError("您输入的手机号码(段)有误!");
phoneSecEditText.requestFocus();
// 将显示查询结果的TextView清空
resultView.setText("");
return;
}
//Android4.0以后便不可以在主线程中访问网络了,因此要新开线程
Runnable r = new NetWorkHandler();
Thread thread = new Thread(r);
thread.start();
// 由于网络连接需要一定时间,为了在主界面上进行网络信息的展现,暂时用sleep()方法简单实现,使主线程等待网络信息读取完成。
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
} if (result != null) {
resultView.setText(result);
}
} }); } /**
* 手机号段归属查询
*
* @param phoneSec手机号段
*/
private void getRemoteInfo(String phoneSec) {
// 命名空间
String nameSpace = "http://WebXml.com.cn/";
// 调用的方法名称
String methodName = "getMobileCodeInfo";
// EndPoint
String endPoint = "http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx";
// SOAP Action 为命名空间+方法名称
String soapAction = "http://WebXml.com.cn/getMobileCodeInfo"; // 指定WebService的命名空间和调用的方法名
SoapObject rpc = new SoapObject(nameSpace, methodName); // 设置需调用WebService接口需要传入的两个参数mobileCode、userId
rpc.addProperty("mobileCode", phoneSec);
rpc.addProperty("userId", ""); // 生成调用WebService方法的SOAP请求信息,并指定SOAP的版本
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER12); envelope.bodyOut = rpc;
// 设置是否调用的是dotNet开发的WebService
envelope.dotNet = true;
// 等价于envelope.bodyOut = rpc;
envelope.setOutputSoapObject(rpc); HttpTransportSE transport = new HttpTransportSE(endPoint);
try {
// 调用WebService
transport.call(soapAction, envelope);
} catch (Exception e) {
e.printStackTrace();
System.out.println("调用webservice异常");
} // 获取返回的数据
SoapObject object = (SoapObject) envelope.bodyIn;
if (object != null)
// 获取返回的结果
result = object.getProperty(0).toString();
else {
System.out.println("object为空");
}
} private class NetWorkHandler implements Runnable { @Override
public void run() {
getRemoteInfo(phoneSec); } }
}

注意:千万不要忘记在清单文件中加上权限<uses-permission android:name="android.permission.INTERNET" />

当然,从程序严谨的角度来讲最好再加上手机是否连网的判断。

该例子在wifi环境下测试无异常,不保证在使用流量的情况下也正常。最后的效果如下图:

第十五章:Android 调用WebService(.net平台)的更多相关文章

  1. 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记

    第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...

  2. Gradle 1.12用户指南翻译——第四十五章. 应用程序插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  3. Gradle 1.12用户指南翻译——第二十五章. Scala 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  4. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  5. Gradle 1.12 翻译——第十五章. 任务详述

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

  6. Gradle 1.12用户指南翻译——第三十五章. Sonar 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  7. C++ Primer Plus学习:第十五章

    第十五章 友元.异常和其他 友元 友元类 表 0-1 class Tv { public: friend class Remote; } Remote类可以使用Tv的数据成员,Remote类在Tv类后 ...

  8. Gradle 1.12用户指南翻译——第六十五章. Maven 发布(新)

    其他章节的翻译请参见:http://blog.csdn.net/column/details/gradle-translation.html翻译项目请关注Github上的地址:https://gith ...

  9. 第十五章、Python多线程之信号量和GIL

    目录 第十五章.Python多线程之信号量和GIL 1. 信号量(Semaphore) 2. GIL 说明: 第十五章.Python多线程之信号量和GIL 1. 信号量(Semaphore) 信号量用 ...

随机推荐

  1. 1-11 ICMP协议

    ICMP协议 IP不提供可靠的传输服务,也不提供端到端或点到点的确认,如果出错可以通过ICMP报告来看,它在IP模块中实现.TCP/IP协议设计了ICMP就是为了弥补IP协议的不足. 它是TCP/IP ...

  2. 【Django】Django model与数据库操作对应关系(转)

    Django对数据库的操作分用到三个类:Manager.QuerySet.Model. Manager的主要功能定义表级方法(表级方法就是影响一条或多条记录的方法),我们可以以models.Manag ...

  3. 【python3】collections系列介绍

    文章来源:http://www.jb51.net/article/48771.htm (http://www.cnblogs.com/wushank/p/5122786.html) 修改人:天马流行拳 ...

  4. C语课设心得分享(二)

    咱们今儿说说IDE的事儿. IDE是「集成开发环境」的意思,比如咱们常用的VC6.0,就是开发C语言所用的IDE的一种.对于IDE的认识,可能有些朋友有点儿模糊,咱们捋一捋,我也会给出一些IDE方面的 ...

  5. Get the Uniqueid of Action Originate in the AMI

    [asterisk-users] Get the Uniqueid of Action Originate in the AMI Adolphe Cher-Aime acheraime at gmai ...

  6. MATLAB - 练习程序,求灰度图像均值、最大、最小数值

    clear all; close all; clc img=imread('lena.bmp'); figure; imshow(uint8(img)); [m n]=size(img); img_m ...

  7. 在Mac上安装IntelliJ IDEA

    这篇文章旨在介绍如何在Mac系统上安装IntelliJ IDEA,至于IntelliJ IDEA的介绍和使用方法,大家另行查阅,本篇的文章不再详细阐述. 简短解说,IntelliJ IDEA是可以用来 ...

  8. java根据逗号分隔字符串,后加上单引号

    public class SpiltString { public String spilt(String str) {  StringBuffer sb = new StringBuffer();  ...

  9. 设置随处都可以调用tcc的编译环境

    tcc的短小精悍,编译速度快,以及独特的直接运行c代码功能,让tcc成为一个出色的编译器,横跨linux,windows平台. 笔者目前尚处于学习c(ANSI c/ISO c)阶段,为了加强手写代码的 ...

  10. select与poll函数介绍

    select与poll函数介绍 在所有依从POSIX的平台上,select函数使我们可以执行I/O多路转接.传向select的参数告诉内核: 1)我们所关心的描述符 2)对于每个描述符我们所关心的状态 ...