一、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作为例子给大家,他们的官网:
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版本的