一、webservices 简介

1.从表面上看,Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web service 的应用程序叫做客户。例如,你想创建一个Web service ,它的作用是返回当前的天气情况。那么你可以建立一个ASP页面,它接受邮政编码作为查询字符串,然后返回一个由逗号隔开的字符串,包含了当前的气温和天气。要调用这个ASP页面,客户端需要发送下面的这个HTTP的GET接着返回的数据就应该是这样。 

       2.Web service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。

webservices 也区分以 .aspx、.ashx、.asmx三种格式地址,aspx文件也就是普通的页面文件,ashx就是一般处理程序,他没有页面部分,asmx文件也就是轻量级的WebService。aspx与ashx处理效率差不多,但ashx仍是首选。asmx处理效率非常低下只有前者的1/3,故在高性能环境下慎用。

1、为啥ashx是首选?

   ashx比较轻量级,没有aspx实现的复杂,他只是一个简单服务端处理请求程序,而aspx框架需要处理更多的额外的东西,加上aspx属于动态编译,首次访问速度会非常慢,本次试验已经去掉了这个阶段,另外通过上面分析数据可知,即使我去掉了多余的内容,其实际传输内容也比ashx多,但两者处理效率总体来说非常接近,大家可以根据自己的需要抉择。

2、为啥asmx效率介么低?

   这是一个SOA范畴的程序,遵守一些SOA的标准协议,服务端收到请求后返回的结果不能直接返回,还需要使用标准的SOAP协议组织好数据,类似一个XML文档结构的返回流,从分析结果图中也可以看出来,他返回的数据量比前者高出一位数,总之基于序列化和多余的XML文档数据等使得他处理请求的能力远不如前者。

本文对ashx 和asmx 都放一个案例供参考。

去哪里获取WebService服务

网上有很多提供WebService的站点,首先找到这些站点,然后获取相应的服务即可! 这里选取WebXml作为例子给大家,他们的官网:

webXmlhttp://www.webxml.com.cn/zh_cn/index.aspx

自行注册一个用户可以免费试用服务5天 会员专区首页有你的userID

raw socket权限Android android raw assets_数据

点击web服务可以看支持哪些服务内容

raw socket权限Android android raw assets_Web_02

然后打开对应的方法连接如下图

raw socket权限Android android raw assets_应用程序_03

根据相应的copy下来待会要用

ashx 是我们公司客户提供的这里就不拿出来了,但是代码不影响正常使用,webxml 里用的是asmx



(1)ashx  

用的是httpURLconnection 

public static String Url = "http:*********************.ashx";                    //一般为空
public static String sendPostRequest(Map<String, String> params, Map<String, String> headers) {
    StringBuilder buf = new StringBuilder();//      params为传入的参数,action 为key,values是方法名
    Set<Map.Entry<String, String>> entrys = null;
    if (params != null && !params.isEmpty()) {
        entrys = params.entrySet();
        for (Map.Entry<String, String> entry : entrys) {
            try {
                Log.d("PostRequest1", entry.getKey() + "=" + entry.getValue());
                buf.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "UTF-8")).append("&");
            } catch (UnsupportedEncodingException e) {
                Log.d("PostRequest1", e.getMessage());
                e.printStackTrace();
            }
        }
        Log.d("PostRequest1", buf.toString());
        buf.deleteCharAt(buf.length() - 1);
    }
    Log.d("调用url", Url + "?" + buf.toString());
    URL url1 = null;
    try {
        url1 = new URL(Url);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    HttpURLConnection conn = null;
    try {
        conn = (HttpURLConnection) url1.openConnection();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        conn.setRequestMethod("POST");
        conn.setConnectTimeout(10000);
    } catch (ProtocolException e) {
        e.printStackTrace();
    }
    conn.setDoInput(true);
    conn.setDoOutput(true);
    OutputStream out = null;
    try {
        out = conn.getOutputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        out.write(buf.toString().getBytes("UTF-8"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (headers != null && !headers.isEmpty()) {
        entrys = headers.entrySet();
        for (Map.Entry<String, String> entry : entrys) {
            conn.setRequestProperty(entry.getKey(), entry.getValue());
        }
    }
    try {
        conn.getResponseCode(); // 为了发送成功
    } catch (IOException e) {
        e.printStackTrace();
    }
    int code = 0;
    InputStream in = null;
    String response = "";
    try {
        code = conn.getResponseCode();
    } catch (IOException e) {
        e.printStackTrace();
    }
    if (code == 200) {
        try {
            in = conn.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
            String readLine = null;
            while ((readLine = br.readLine()) != null) {
                response = response + readLine;
            }
        } catch (IOException e) {
            e.printStackTrace();
            response = errorJson(code, "系统错误");
        }
    } else {
        response = errorJson(code, "系统错误");
    }
    Log.d("返回值", response);
    return response;
}
public static String errorJson(int code, String errmsg) {
    StringBuffer sb = new StringBuffer();
    sb.append("{");
    sb.append("errno:").append(code).append(",");
    sb.append("\"errmsg\":").append("\"").append(errmsg).append("\"");
    sb.append("}");
    return sb.toString();
}



返回是json数据依次解析就可以了。

(2)asmx

public static String nameSpace = "http://WebXml.com.cn/";//命名空间
    public static String soapAction = "http://WebXml.com.cn/getMobileCodeInfo";//soapAction
    public static String method = "getMobileCodeInfo";//归属地查询方法名
    public static String servicesAddress = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx";//服务地址
    private void getMobileCodeInfo() {
//                                            命名空间     方法名
        SoapObject soapObject = new SoapObject(nameSpace, method);
        //                      传入条件key       电话
        soapObject.addProperty("mobileCode", "1500****319");
        soapObject.addProperty("userID", "8bb3d34e44f940fa8163aef37916e264");//注册的ID,可以空
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.bodyOut = soapObject;
        envelope.dotNet = true;
        envelope.setOutputSoapObject(soapObject);
        HttpTransportSE se = new HttpTransportSE(servicesAddress);
        try {
            se.call(soapAction, envelope);//发送请求
        } catch (IOException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        }
        SoapObject soapObject1 = (SoapObject) envelope.bodyIn;
        Message msg = new Message();
        msg.obj = soapObject1.getProperty("getMobileCodeInfoResult");//返回数据类型依据服务,这里是字符串
        handler.sendMessage(msg);
    }

最后附上ksoap下载地址,网上也很多,我这是2.5.4版本的

点击打开链接ksoap2.5.4-android 下载