加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

webservice的简单调用

发布时间:2020-12-16 23:42:12 所属栏目:安全 来源:网络整理
导读:webservice的理解: (参看:http://blog.csdn.net/lyq8479/article/details/6420398) 可以认为: webservice就是一个远程服务器提供的方法,我们可以在本地调用该方法(就像调用本地的方法一样),并且可以通过这个方法实现某些功能(比如查询天气等) 。 w

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。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读