WebService理解和代码解析

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: /** WebServcie 概念 多个系统数据交换: 跨平台语言的相互通信; 如:java 的客户端 和dotnet的服务器端的接口调用: 得到接口和方法 : 基于标准的协议,可编程语言; 服务器开发 api; 特点: 自包含:只要客户端支持http和xml就可以; 自描述:只需要知道请求响应的类型; 其他的不需要考虑 跨平台:不同语言可以相互通信。

/** WebServcie 概念  

多个系统数据交换: 跨平台语言的相互通信;
	如:java 的客户端 和dotnet的服务器端的接口调用:
		得到接口和方法	: 基于标准的协议,可编程语言;  服务器开发 api;
	
	特点:
		自包含:只要客户端支持http和xml就可以;
		自描述:只需要知道请求响应的类型;  其他的不需要考虑
		跨平台:不同语言可以相互通信。
		通过网络:发布查找使用;
		松耦合;
	
	术语:
		XML:扩展型可标记语言;
		SOAP:简单对象访问协议;用来描述传递信息的格式;  xml方法的调用规范;支持http等协议
		WSDL:web描述性语言,xml文档,自动生成;;  说明一组soap消息,和如何交互消息,是软件自动生成的xml文档;
		UDDI:英文为 "Universal Description, Discovery and Integration"通用描述、发现与集成服务;  引导系统查找响应服务的机制;
			 根据描述文档,来引导系统查找响应服务的机制。  提供自出服务,其他厂商根据服务;
			 
			 
		【公司的举例:】		
			soap 协议、合同,约束双方   
			wsdl  说明书,提供什么服务    
			uddi 工商注册,方便别人查询

		

*/

/* wsdl  
	wsdl 文档包含
	
		详细学习:http://www.w3school.com.cn/wsdl/wsdl_documents.asp
		
		某种类型系统:
		
		WSDL 文档是利用这些主要的元素来描述某个 web service 	
		
		元素 		定义
		<portType>	 web service 执行的操作
		<message> 	web service 使用的消息
		<types> 	web service 使用的数据类型
		<binding> 	web service 使用的通信协议

		
		
*/

/* soap  
	简单对象的访问协议;
		基于xml协议,以xml形式提供了一个简单的数据交换的协议;
		访问web服务的简单对象的访问协议
		通过http实现信息传递
		1)soap封装:描述消息中的内容;
		2)soap编码规则:定义序列化的机制、应用程序类型实例;
		3)soap rpc : 远程应答的协议  远程过程调用
		4)soap绑定: 节点间交互 soap的封装
	
	格式如:
POST /webservices/EnglishChinese.asmx HTTP/1.1
Host: fy.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/Translator"

<?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>
    <Translator xmlns="http://WebXml.com.cn/">
      <wordKey>string</wordKey>
    </Translator>
  </soap:Body>
</soap:Envelope>	

	规则:
		需要使用xml编码
		<soap:Body>是必须的
		Type传输数据类型
		soap:Envelope 必须使用命名空间

	优点:1)可扩展;2)简单的;3)和厂商无关;4)编程语言无关;

*/

//***********【soap1.1 解析的过程】**************
/**
	soap 1.1  xmlpull  conn  URL   
	
	1.代码和注解
	2.xml文件
	
*/

/**  2016年9月  整理webService的解析  (单词以外的链接有问题)
	 * WebService POST 请求 Soap1.1协议、 xml解析
	 * 
	 * @see 单词翻译查询网址:
	 * @see 1.网址:http://fy.webxml.com.cn/webservices/EnglishChinese.asmx
	 * @see 2.选方法: Translator 查询单词
	 * @see 3.方法中看soap协议,1.1或者1.2。对应post 中,xml部分复制,在asset中建立xml文件保存。
	 * @see 4.修改xml中 ,参数部分,如:<wordKey>string</wordKey> 。其中string修改为
	 *      #word,方便后续代码替换
	 * @see 步骤
	 * @see 1、xml参数转 流,替换单词参数, 并创建HttpURLConnection链接
	 * @see 2、conn设置链接的 协议,参考 soap文件 conn.setRequestProperty("Content-Type",
	 *      "text/xml; charset=utf-8"); Content-Type Content-Length SOAPAction
	 * @see 3、os 输出流 写 刷新
	 * @see 4、输入流 并 xml解析
	 * 
	 * 
	 * @throws IOException
	 * @throws XmlPullParserException
	 */
	public void WspostSoap11() throws IOException, XmlPullParserException {

		/*
		 * ( 1.inputstream 2.url 3.outputstaam 4.inputsteeem 5.xmlpull
		 */

		String path = "word.xml";

		InputStream is = getAssets().open(path);// MainActivity.class.getClassLoader().getResourceAsStream(path);
		InputStreamReader reader = new InputStreamReader(is, "utf-8");
		BufferedReader bfReader = new BufferedReader(reader);
		String str = "";
		StringBuilder sb = new StringBuilder();
		while ((str = bfReader.readLine()) != null) {
			// str += str.replace("#word", "girl");
			sb.append(str.replace("#word", "girl"));
		}
		byte[] data = sb.toString().getBytes();

		String url = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx";
		URL urls = new URL(url);
		HttpURLConnection conn = (HttpURLConnection) urls.openConnection();
		conn.setRequestMethod("POST");
		conn.setConnectTimeout(5 * 1000);
		conn.setReadTimeout(3 * 1000);
		conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
		conn.setRequestProperty("Content-Length", data.length + "");
		conn.setRequestProperty("SOAPAction", "http://WebXml.com.cn/Translator");
		conn.setDoOutput(true);

		OutputStream os = conn.getOutputStream();
		os.write(data, 0, data.length);

		os.flush();

		InputStream isRusult = conn.getInputStream();

		XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
		XmlPullParser parser = factory.newPullParser();

		parser.setInput(isRusult, "utf-8");

		String result = "";
		while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
			if (parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("Translation")) {
				result = parser.nextText();
			}
			if ("Trans".equals(parser.getName())) {
				Log.e(TAG, " Trans  " + parser.toString());
			}
			parser.next();

		}

		Log.e(TAG, " result  " + result);

	}
//=====================word.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>
    <Translator xmlns="http://WebXml.com.cn/">
      <wordKey>#word</wordKey>
    </Translator>
  </soap:Body>
</soap:Envelope>

//=====================参考的 SOAP 1.1
POST /webservices/EnglishChinese.asmx HTTP/1.1
Host: fy.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/Translator"

<?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>
    <Translator xmlns="http://WebXml.com.cn/">
      <wordKey>string</wordKey>
    </Translator>
  </soap:Body>
</soap:Envelope>

//***********【soap1.2 解析的过程】**************
/**
	 * WebService POST 请求 Soap1.2协议、 xml解析
	 * 
	 * @see 单词翻译查询网址:
	 * @see 1.网址:http://fy.webxml.com.cn/webservices/EnglishChinese.asmx
	 * @see 2.选方法: Translator 查询单词
	 * @see 3.方法中看soap协议,1.1或者1.2。对应post 中,xml部分复制,在asset中建立xml文件保存。
	 * @see 4.修改xml中 ,参数部分,如:<wordKey>string</wordKey> 。其中string修改为
	 *      #word,方便后续代码替换
	 * @see 步骤
	 * @see 1、xml参数转 流,替换单词参数, 并创建HttpURLConnection链接
	 * @see 2、conn设置链接的 协议,参考 soap文件 conn.setRequestProperty("Content-Type",
	 *      "text/xml; charset=utf-8"); Content-Type Content-Length SOAPAction
	 * @see 3、os 输出流 写 刷新
	 * @see 4、输入流 并 xml解析
	 * 
	 * @category soap 1.1 与  1.2 不同地方两个:
	 * 			1、setRequestProperty   1.2 设置协议中没有 SOAPAction
	 * 			2、1.2 协议的 xml文件不太一样。
	 * @throws IOException
	 * @throws XmlPullParserException
	 */
	public void WspostSoap12() throws IOException, XmlPullParserException {

		/*
		 * ( 1.inputstream 2.url 3.outputstaam 4.inputsteeem 5.xmlpull
		 */

		String path = "word12.xml";

		InputStream is = getAssets().open(path);// MainActivity.class.getClassLoader().getResourceAsStream(path);
		InputStreamReader reader = new InputStreamReader(is, "utf-8");
		BufferedReader bfReader = new BufferedReader(reader);
		String str = "";
		StringBuilder sb = new StringBuilder();
		while ((str = bfReader.readLine()) != null) {
			sb.append(str.replace("#word", "boy"));
		}
		byte[] data = sb.toString().getBytes();

		String url = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx";
		URL urls = new URL(url);
		HttpURLConnection conn = (HttpURLConnection) urls.openConnection();
		conn.setRequestMethod("POST");
		conn.setConnectTimeout(5 * 1000);
		conn.setReadTimeout(3 * 1000);
		conn.setRequestProperty("Content-Type", "application/soap+xml; charset=utf-8");
		conn.setRequestProperty("Content-Length", data.length + "");
//		conn.setRequestProperty("SOAPAction", "http://WebXml.com.cn/Translator");
		conn.setDoOutput(true);

		OutputStream os = conn.getOutputStream();
		os.write(data, 0, data.length);

		os.flush();

		InputStream isRusult = conn.getInputStream();

		XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
		XmlPullParser parser = factory.newPullParser();

		parser.setInput(isRusult, "utf-8");

		String result = "";
		while (parser.getEventType() != XmlPullParser.END_DOCUMENT) {
			if (parser.getEventType() == XmlPullParser.START_TAG && parser.getName().equals("Translation")) {
				result = parser.nextText();
			}
			if ("Trans".equals(parser.getName())) {
				Log.e(TAG, " Trans  " + parser.getName());
			}
			parser.next();
		}
		Log.e(TAG, " result  " + result);
	}

//**********【使用jar包的解析方法soap】**********************
	/**
	 * soap 解析
	 * 
	 * @see 1.导包 ksoap2-android-assembly-2.5.2-jar-with-dependencies.jar
	 * @see 2.定义网址、方法、命名空间
	 * @see 3.HttpTransportSE soap请求对象
	 * @see 4.SoapSerializationEnvelope soap序列化后的封装对象: soap信封
	 * @see 5.SoapObject 参数对象 并设置 addProperty
	 * @see 6.htse 调用 call方法 client.call(namespace + method, envelope);
	 * @see 7.信封中  查看响应 envelope.getResponse,返回bodyIn信息:字符串替换查找
	 * 
	 */
	public void soapDictionaryWord() {
		try {
			// 要访问的网址
			String wsdl = "http://fy.webxml.com.cn/webservices/EnglishChinese.asmx";
			// webservice 的功能名称
			String method = "Translator";
			// 响应数据的namespace
			String namespace = "http://WebXml.com.cn/";

			// soap客户端 http传输协议对象 send envelope
			HttpTransportSE client = new HttpTransportSE(wsdl);
			// soap序列化后的封装对象: soap信封
			SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
			// 参数对象 目标
			SoapObject params = new SoapObject(namespace, method);

			// 添加要翻译的单词 添加属性
			params.addProperty("wordKey", "Everybody");
			// 设置参数对象 放入信封
			envelope.bodyOut = params;
			// 设置支持dotNet 服务器
			envelope.dotNet = true;

			// 访问webService 1.设置所需的SOAPAction头字段 2.包含soap调用信息的信封
			client.call(namespace + method, envelope);
			// 有响应结果 ; api 从包装对象中拉取一个对象,并返回,不为空表示得到了对象
			if (envelope.getResponse() != null) {
				// 返回响应对象 接收信封中的内容
				SoapObject response = (SoapObject) envelope.bodyIn;
				// 处理响应数据 : 返回指定位置的特定属性 0;得到body中的内容
				SoapObject obj = (SoapObject) response.getProperty(0);

				System.out.println("------" + obj);
				// 获取响应的字符串
				String result = obj.toString();
				// 找截断的起始位置
				int firstIndex = result.indexOf("Translation=");
				// 找截断的终止位置
				int endIndex = result.indexOf(";", firstIndex);
				// 翻译后的字符串
				String transWord = result.substring(firstIndex + "Translation=".length(), endIndex);

				System.out.println("------" + transWord);
				System.out.println("------" + getResult(result, "Trans=别", "。"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//测试解析字符串的方法
	public String getResult(String resu, String starStr, String endStr) {
		int first = resu.indexOf(starStr);
		int end = resu.indexOf("。", first);
		return resu.substring(first + starStr.length() - 1, end);
	}





















目录
相关文章
|
4天前
|
自然语言处理 搜索推荐 数据安全/隐私保护
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
鸿蒙登录页面设计展示了 HarmonyOS 5.0(Next)的未来美学理念,结合科技与艺术,为用户带来视觉盛宴。该页面使用 ArkTS 开发,支持个性化定制和无缝智能设备连接。代码解析涵盖了声明式 UI、状态管理、事件处理及路由导航等关键概念,帮助开发者快速上手 HarmonyOS 应用开发。通过这段代码,开发者可以了解如何构建交互式界面并实现跨设备协同工作,推动智能生态的发展。
39 10
鸿蒙登录页面好看的样式设计-HarmonyOS应用开发实战与ArkTS代码解析【HarmonyOS 5.0(Next)】
|
23天前
|
PHP 开发者 容器
PHP命名空间深度解析:避免命名冲突与提升代码组织####
本文深入探讨了PHP中命名空间的概念、用途及最佳实践,揭示其在解决全局命名冲突、提高代码可维护性方面的重要性。通过生动实例和详尽分析,本文将帮助开发者有效利用命名空间来优化大型项目结构,确保代码的清晰与高效。 ####
21 1
|
1月前
|
机器学习/深度学习 存储 人工智能
强化学习与深度强化学习:深入解析与代码实现
本书《强化学习与深度强化学习:深入解析与代码实现》系统地介绍了强化学习的基本概念、经典算法及其在深度学习框架下的应用。从强化学习的基础理论出发,逐步深入到Q学习、SARSA等经典算法,再到DQN、Actor-Critic等深度强化学习方法,结合Python代码示例,帮助读者理解并实践这些先进的算法。书中还探讨了强化学习在无人驾驶、游戏AI等领域的应用及面临的挑战,为读者提供了丰富的理论知识和实战经验。
55 5
|
1月前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
143 10
|
1月前
|
前端开发 JavaScript 开发者
揭秘前端高手的秘密武器:深度解析递归组件与动态组件的奥妙,让你代码效率翻倍!
【10月更文挑战第23天】在Web开发中,组件化已成为主流。本文深入探讨了递归组件与动态组件的概念、应用及实现方式。递归组件通过在组件内部调用自身,适用于处理层级结构数据,如菜单和树形控件。动态组件则根据数据变化动态切换组件显示,适用于不同业务逻辑下的组件展示。通过示例,展示了这两种组件的实现方法及其在实际开发中的应用价值。
44 1
|
2月前
|
机器学习/深度学习 人工智能 算法
揭开深度学习与传统机器学习的神秘面纱:从理论差异到实战代码详解两者间的选择与应用策略全面解析
【10月更文挑战第10天】本文探讨了深度学习与传统机器学习的区别,通过图像识别和语音处理等领域的应用案例,展示了深度学习在自动特征学习和处理大规模数据方面的优势。文中还提供了一个Python代码示例,使用TensorFlow构建多层感知器(MLP)并与Scikit-learn中的逻辑回归模型进行对比,进一步说明了两者的不同特点。
104 2
|
2月前
|
存储 搜索推荐 数据库
运用LangChain赋能企业规章制度制定:深入解析Retrieval-Augmented Generation(RAG)技术如何革新内部管理文件起草流程,实现高效合规与个性化定制的完美结合——实战指南与代码示例全面呈现
【10月更文挑战第3天】构建公司规章制度时,需融合业务实际与管理理论,制定合规且促发展的规则体系。尤其在数字化转型背景下,利用LangChain框架中的RAG技术,可提升规章制定效率与质量。通过Chroma向量数据库存储规章制度文本,并使用OpenAI Embeddings处理文本向量化,将现有文档转换后插入数据库。基于此,构建RAG生成器,根据输入问题检索信息并生成规章制度草案,加快更新速度并确保内容准确,灵活应对法律与业务变化,提高管理效率。此方法结合了先进的人工智能技术,展现了未来规章制度制定的新方向。
50 3
|
2月前
|
SQL 监控 关系型数据库
SQL错误代码1303解析与处理方法
在SQL编程和数据库管理中,遇到错误代码是常有的事,其中错误代码1303在不同数据库系统中可能代表不同的含义
|
2月前
|
SQL 安全 关系型数据库
SQL错误代码1303解析与解决方案:深入理解并应对权限问题
在数据库管理和开发过程中,遇到错误代码是常见的事情,每个错误代码都代表着一种特定的问题
|
3月前
|
敏捷开发 安全 测试技术
软件测试的艺术:从代码到用户体验的全方位解析
本文将深入探讨软件测试的重要性和实施策略,通过分析不同类型的测试方法和工具,展示如何有效地提升软件质量和用户满意度。我们将从单元测试、集成测试到性能测试等多个角度出发,详细解释每种测试方法的实施步骤和最佳实践。此外,文章还将讨论如何通过持续集成和自动化测试来优化测试流程,以及如何建立有效的测试团队来应对快速变化的市场需求。通过实际案例的分析,本文旨在为读者提供一套系统而实用的软件测试策略,帮助读者在软件开发过程中做出更明智的决策。

热门文章

最新文章

推荐镜像

更多