webservice的简单调用
webservice的理解:(参看:http://blog.csdn.net/lyq8479/article/details/6420398) 可以认为:webservice就是一个远程服务器提供的方法,我们可以在本地调用该方法(就像调用本地的方法一样),并且可以通过这个方法实现某些功能(比如查询天气等)。 wsdl文档中常用的属性: targetNamespace:该webservice的名称空间。 soap12:指的是当前webservice所使用的soap版本。 <wsdl:types>标签中可以看到自己可以调用哪些方法。它的下面有一个标签<s:element name="">name的值便是可以调用的方法名(如果方法名以Response结尾 ,就是相应方法的返回结果的方法)。 在每一个<s:element>标签下面会有<s:sequence>标签,此标签的下面还有<s:element>这里的name值便是相应方法需要传入的参数名。 <wsdl:binding>标签下有<wsdl:operation>标签,后者的下面还有<soap:operation soapAction="">,该soapAction的值便是访问该方法是http header的SOAPAction的值。 <wsdl:service>标签下有<wsdl:port>,后者的下面还有<soap:address location="">,location的值便是要访问的url的值。该值也等于wsdl的地址值除掉后面的"?wsdl"。 使用过程: 首先根据wsdl文档的<wsdl:types>标签下的<s:element>标签查询到方法名以及方法的参数。 其次根据<wsdl:binding>下的<wsdl:operation>中的name值,得到不同方法的soapAction。 然后在<wsdl:service>中得到<soap:address>标签中的location的值。 最后:通过url请求的方式进行访问,得到自己要的结果。 要注意:在使用http请求的时候,必须设置"SOAPAction"的值(也就是第二步中得到的值),如果没有的话,就设置为""。 示例:以下调用的webservice是http://www.webxml.com.cn/WebServices/WeatherWebservice.asmx?op=getWeatherbyCityName中的。 在访问的时候,需要将参数按照webservice指定的格式传过去即可。并且需要将它需要的消息头也带过去。 首先看webservice需要的参数以及参数格式: 其中后面的xml文件就是自己要传递的参数的样式,也就是说需要把参数拼装成xml文件传递过去。具体代码:
private String get() { try { // 加载xml模板,用于拼装数据。将模板放在assets目录下的temp文件夹中 AssetManager assets = MainActivity.this.getAssets(); InputStream stream = assets.open("temp/template.xml"); byte[] buff = new byte[stream.available()]; stream.read(buff,stream.available()); String s = new String(buff,buff.length); //在模板中用特殊字条代码要传递的参数,然后将其替换成参数 s = s.replace("$cityname$","郑州"); //要访问的url URL url = new URL( "http://www.webxml.com.cn/WebServices/WeatherWebservice.asmx"); HttpURLConnection connection = (HttpURLConnection) url .openConnection(); // 设置http请求的header connection.addRequestProperty("Content-Type","text/xml; charset=utf-8"); connection.addRequestProperty("Content-Length",s.getBytes().length + ""); connection.addRequestProperty("SOAPAction","http://WebXml.com.cn/getWeatherbyCityName"); // 操作connection,将数据传递过去 connection.setDoOutput(true); connection.setReadTimeout(5000); connection.setRequestMethod("POST");//设置请求方法 // 打开连接,从而可以传参 connection.connect(); // 获取输出流,将数据写到流中,传递到服务器中 OutputStream out = connection.getOutputStream(); out.write(s.getBytes()); out.flush(); out.close(); // 打开输入流,得到服务端返回的数据 BufferedReader reader = new BufferedReader(new InputStreamReader( connection.getInputStream())); String line = ""; StringBuilder sb = new StringBuilder(); while ((line = reader.readLine()) != null) { sb.append(line); } reader.close(); connection.disconnect(); System.out.println(sb.toString()); return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; } 其中的url是Host和POST后面拼出来的。对于SAOPAction来说,一般就是webservice的名称空间+要访问的方法名。 其中template.xml文件为:
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <getWeatherbyCityName xmlns="http://WebXml.com.cn/"> <theCityName>$cityname$</theCityName> </getWeatherbyCityName> </soap:Body> </soap:Envelope> 这样免得自己再拼xml文件。 调用webservice:首先服务端得给三个值:方法名,调用该方法所对应的uri以及名称空间。 其次,在浏览器中,把uri后拼上?wsdl,打开相应的文档,并搜索对应的方法名。如下: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 其中红框中的部分就是该方法的参数。 ? ? ? ?最后,调用下面访问,进行访问,并返回数据。
/** * 访问webservice获取数据 * @param nameSpace:名称空间 * @param methodName:调用的方法名 * @param endPoint:要进行访问的url * @param values:要带过去的参数,与webservice的参数名一样,顺序一样 * @return */ public static String getData(String nameSpace,String methodName,String endPoint,Map<String,String> values) { // 指定WebService的命名空间和调用的方法名 SoapObject rpc = new SoapObject(nameSpace,methodName); // 调用SoapObject将参数传给Webservice服务器 Set<String> keys = values.keySet(); Iterator<String> iterator = keys.iterator(); while (iterator.hasNext()) { String key = iterator.next(); String value = values.get(key); rpc.addProperty(key,value); } // 使用SOAP1.1协议创建Envelop对象 SoapSerializationEnvelope envelope = new SoapSerializationEnvelope( SoapEnvelope.VER11); envelope.bodyOut = rpc; envelope.dotNet = true; // 创建HttpTransportSE对象,传递WebService服务器地址 HttpTransportSE transport = new HttpTransportSE(endPoint); // 设置与.Net提供的Web Service保持较好的兼容性 envelope.dotNet = true; try { // 调用Web Service transport.call(nameSpace + methodName,envelope); if (envelope.getResponse() != null) { Object result = envelope.getResponse(); String str = (String) result.toString(); // 获得请求的字符串 return str; } } catch (Exception e) { e.printStackTrace(); } return null; }? ? ? ?在访问的时候需要用到ksoap2-android-assembly-3.2.0-jar-with-dependencies.jar。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |