一、webservices 简介
1.从表面上看,Web service 就是一个应用程序,它向外界暴露出一个能够通过Web进行调用的API。这就是说,你能够用编程的方法通过Web来调用这个应用程序。我们把调用这个Web service 的应用程序叫做客户。例如,你想创建一个Web service ,它的作用是返回当前的天气情况。那么你可以建立一个ASP页面,它接受邮政编码作为查询字符串,然后返回一个由逗号隔开的字符串,包含了当前的气温和天气。要调用这个ASP页面,客户端需要发送下面的这个HTTP的GET接着返回的数据就应该是这样。
2.Web service平台是一套标准,它定义了应用程序如何在Web上实现互操作性。你可以用任何你喜欢的语言,在任何你喜欢的平台上写Web service ,只要我们可以通过Web service标准对这些服务进行查询和访问。
3.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作为例子给大家,他们的官网:
webXml:http://www.webxml.com.cn/zh_cn/index.aspx
自行注册一个用户可以免费试用服务5天 会员专区首页有你的userID
点击web服务可以看支持哪些服务内容
然后打开对应的方法连接如下图
根据相应的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版本的