`
andongoop
  • 浏览: 62295 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

以模板方式处理数据接口

阅读更多

自己的一点点思路,欢迎大家拍砖

1.    背景

需要为第三方提供数据接口

此数据接口的特点为:接口特别多,需要为每个功能都提供数据接口

2.     设计目标

1)XML作为数据的载体

2)开发人员在源代码中可以清晰的获得数据接口的结构

3)数据接口具有较强的扩展性

3.     设计思路

1)开发前先定义好接口模板,程序启动时将接口模板加载到内存中

2)内存中构造出与接口模板想匹配的数据模型,见数据模型与接口模板进行数据绑定

4.      实现

Entity.java  实体类,与接口模板进行数据绑定

TemplateConfig.java  模板配置类,用于将模板文件加载到内存中

TemplateXML.java  XML模板处理类,生成数据接口

error.xml  数据接口模板  绑定规则  type属性默认为string;type=list 代表集合;type=entity代表实体;dataName 对应实体中的key

 

public final class Entity {
	
	private Map<String, Object> genericValue = new HashMap<String, Object>();
	
	public Entity put(String key, Object value){
		genericValue.put(key, value);
		return this;
	}
	
	public Object get(String key){
		return genericValue.get(key);
	}
	
	public String getString(String key){
		try {
			return (String)genericValue.get(key);
		} catch (ClassCastException e) {
			return "Null";
		}
	}
	
	public Entity getEnttiy(String key){
		try {
			return (Entity)genericValue.get(key);
		} catch (ClassCastException e) {
			return new Entity();
		}
	}
}
 
public class TemplateConfig {
	
	public static Map<String, Document> templates = null;
	private static File fileDirector = null;
	private static InputStream is = null;
	
	static {
		templates = new HashMap<String, Document>();
		fileDirector = new File(TemplateConfig.class.getClass().getResource("/config/template").getPath());
	}
	
	public static void init() throws TemplateException{
		load(fileDirector);
		try {
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private static void load(File fileDirector) throws TemplateException{
		if (fileDirector.isDirectory()){
			for (File file : fileDirector.listFiles()){
				if (file.isDirectory()){
					load(file);
				}else{
					templates.put(file.getName(), getDocument(file));
				}
			}
		}
	}
	
	public static Document getDocument(File file) throws TemplateException{
		try {
			is = new FileInputStream(file);
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		}
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = null;
		try {
			builder = factory.newDocumentBuilder();
		} catch (ParserConfigurationException e) {
			e.printStackTrace();
			throw new TemplateException(e);
		}
		try {
			return builder.parse(is);
		} catch (SAXException e) {
			e.printStackTrace();
			throw new TemplateException(e);
		} catch (IOException e) {
			e.printStackTrace();
			throw new TemplateException(e);
		}
	}
}
public class TemplateXML implements Template{
	private InputStream is = null;
	private Entity entity = null;
	private Document templateDoc = null;
	
	public TemplateXML(InputStream templateStream, Entity entity){
		this.entity = entity;
		this.is = templateStream;
	}
	
	public TemplateXML(Document templateDoc, Entity entity){
		this.templateDoc = templateDoc;
		this.entity = entity;
	}
	
	public void process() throws Exception{
		Element templateRoot = templateDoc.getDocumentElement();
		NodeList templateNodeList = templateRoot.getChildNodes();
		parserNodeList(templateNodeList, entity);
	}
	
	private Document getDocument(InputStream is) throws Exception{
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = factory.newDocumentBuilder();
		return builder.parse(is);
	}
	
	private void parserNodeList(NodeList nodeList, Entity entity) throws Exception{
		for (int i =0; i< nodeList.getLength(); i++){
			Node node = nodeList.item(i);
			if ("#text".equals(node.getNodeName())) continue;
			String nodeType = "";
			String dataName = "";
			try {
				nodeType = node.getAttributes().getNamedItem("type").getNodeValue();
			} catch (NullPointerException e) {
				nodeType = Template.TYPE_STRING;
			}
			try {
				dataName = node.getAttributes().getNamedItem("dataName").getNodeValue();
				node.getAttributes().removeNamedItem("dataName");
			} catch (NullPointerException e) {
				dataName = node.getNodeName();
			}
			if (Template.TYPE_LIST.equals(nodeType)){
				Entity nodeEntity = entity.getEnttiy(dataName);
				this.parserNodeList(node.getChildNodes(), nodeEntity);
			}else if (Template.TYPE_ENTITY.equals(nodeType)){
				Entity nodeEntity = entity.getEnttiy(dataName);
				this.parserNodeList(node.getChildNodes(), nodeEntity);
			}else {
				String nodeValue = entity.getString(dataName);
				node.setTextContent(nodeValue);
			}
		}
	}
	
	public static void main(String [] args) throws Exception{
		Entity e = new Entity();
		e.put("errorTip", "a");
		e.put("errorCode", "b");
		e.put("errorMsg", "c");
		e.put("dse_operationName", "d");
		e.put("pkgId", "e");
		e.put("contact", new Entity().put("phone", "123").put("address", "beijing"));
		Entity ads = new Entity();
		ads.put("ad", new Entity().put("simg", "simg1").put("bimg", "bimg1"));
		e.put("ads", ads);
		
		TemplateConfig.init();
		TemplateXML tx = new TemplateXML(TemplateConfig.templates.get("error.xml"), e);
		
		tx.process();
		TransformerFactory tf = TransformerFactory.newInstance();  
        Transformer t = tf.newTransformer();
        ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
        t.transform(new DOMSource(tx.templateDoc), new StreamResult(bos));
        System.out.println(bos.toString().replaceAll("\r\n|\t", ""));
	}

}

 

 <?xml version="1.0" encoding="UTF-8"?>

<res>
	<errorTip dataName="errorTip"/>
	<errorCode dataName="errorCode"/>
	<errorMsg dataName="errorMsg"/>
	<operationName dataName="operationName"/>
	<ads dataName="ads" type="list">
		<ad dataName="ad" type="entity">
			<simg dataName="simg"/>
			<bimg dataName="bimg"/>
		</ad>
	</ads>
	<contact type="entity">
		<phone dataName="phone"/>
		<address dataName="address"/>
	</contact>
</res>

结果:

<?xml version="1.0" encoding="UTF-8"?><res><errorTip>a</errorTip><errorCode>b</errorCode><errorMsg>c</errorMsg><dse_operationName>d</dse_operationName><pkgId>e</pkgId><ads type="list"><ad type="entity"><simg>simg1</simg><bimg>bimg1</bimg></ad></ads><contact type="entity"><phone>123</phone><address>beijing</address></contact></res>
 

 

分享到:
评论

相关推荐

    接口文档模板.docx

    - **测试目标**:确保接口功能正确,无数据丢失,错误处理适当。 - **测试用例**:包括正常情况、边界情况、异常情况的测试,如输入非法字符、空值、超出范围的参数值等。 - **断言**:检查接口返回的"code"、...

    restful接口文档模板

    REST(Representational State Transfer)是一种网络应用程序的设计风格和开发方式,基于HTTP协议,可以使用XML或者JSON格式传输数据,一般用于客户端与服务器交互的数据接口。RESTful API设计遵循了REST的原则,...

    API接口模板

    API接口模板是软件开发中非常重要的一个组成部分,它定义了不同系统之间如何通过网络进行通信,交换数据和服务。API(Application Programming Interface)接口是开发者用来构建应用程序或服务的工具集,而接口模板...

    接口文档标准模板-含Word和excel两种

    - 优点:Excel表格擅长处理数据,方便排序、筛选和统计,适合列出多个接口并进行版本管理,便于查看和比较不同接口的参数及返回值。 - 结构布局:Excel模板通常会按工作表分页,如“接口列表”、“请求参数”、...

    软件接口设计说明书模板(空模板).doc

    提供接口的总体描述,包括接口的种类(如软件接口、硬件接口、数据接口、通信接口、人机接口)及其在整个系统中的作用。 7. **接口描述**: 对每个接口进行详细描述,包括接口对象、接口行为、接口依赖、接口同步...

    接口模板 接口文档

    在IT行业中,接口模板和接口文档是开发过程中不可或缺的部分,特别是在构建分布式系统、API服务或者微服务架构时。接口模板通常是指预定义的格式或结构,用于规范接口的设计和描述,确保开发团队遵循统一的标准,...

    http接口开发文档(国内接口,含接口提交模板).doc

    接口返回的数据格式通常为JSON,便于开发者解析和处理。JSON格式具有轻量级、易读性强的特点,是Web服务中常用的响应格式。 四、短信发送 1. JSON变量模板发送:适用于批量发送含有变量的短信,通过JSON对象传递...

    服务器接口对接文档模板

    服务器接口对接文档模板中介绍了接口调用流程,包括调用接口流程说明、时间格式说明、基本数据类型等内容。例如,在 XX 管理接口中,调用流程包括发送请求、接收响应、处理响应等步骤。 知识点4:状态码 在服务器...

    软件项目模板-10 - 接口设计说明(IDD).zip

    在IT行业中,接口设计是软件开发过程中的关键环节,它涉及到不同系统、模块或组件之间的交互方式。"软件项目模板-10 - 接口设计说明(IDD).zip" 提供了一个详细的接口设计文档,这对于确保项目的高效协作和顺利实施至...

    api接口文档模板

    以 OAuth2.0 协议为例(敏感信息都用*号进行了处理,实际请求中需要替换成真实的值): https://graph.qq.com/user/get_user_info?access_token=*&oauth_consumer_key=12345&openid=&format=json 3.4 返回参数说明...

    API 接口 设计文档 模板

    ### API接口设计文档模板知识点详解 #### 一、概述 API(Application Programming Interface)接口设计文档是软件开发过程中不可或缺的一部分,它为开发者提供了清晰、准确的接口调用指南。一个良好的API文档应包括...

    API接口模板-含Word和excel

    本资源“API接口模板-含Word和excel”提供了两种格式的接口文档模板,以满足不同的工作需求。 首先,我们来看Word模板。Word是一种常见的文本编辑工具,适用于创建结构化的文档,对于长篇幅的API文档来说,它提供了...

    数据可视化大屏展示系统(Html模板、大数据模板、大屏echarts模板).zip

    在实际应用中,数据可视化大屏展示系统通常会结合后端数据接口,通过Ajax或者WebSocket等方式实时获取和更新数据。后端可以是基于Python的Django、Flask,Java的Spring Boot,或者是Node.js的Express等框架。前端则...

    接口需求文档模板.rar

    6. **错误处理**:详细列出可能出现的错误情况及对应的处理方式,以确保系统稳定运行。 7. **安全考虑**:讨论接口的安全措施,如认证、授权、加密等,以保护数据安全。 接下来,"接口模板.xlsx"可能是一个电子...

    数据大屏可视化模板(物流大数据服务平台)

    综上所述,这个“数据大屏可视化模板(物流大数据服务平台)”项目涵盖了数据接口设计、数据处理、可视化展示等多个核心环节,是学习和实践物流数据大屏开发的良好起点。通过深入理解和定制这个模板,开发者可以为...

    Web接口文档模板.doc

    4. **调用方法**:在这个例子中,接口使用了HTTP的`POST`方法,意味着客户端向服务器发送数据以创建新的资源。 5. **传入参数**:接口需要接收多个参数,如`eid`(发布会ID)、`name`(发布会标题)、`limit`(限制...

    restful前后端分离api接口文档模板

    ### RESTful前后端分离API接口文档模板解析 #### 一、引言 在现代Web开发中,前后端分离已经成为一种趋势。在这种模式下,前端负责用户界面与用户体验,而后端则专注于业务逻辑处理与数据存储。为了实现这种分离,...

    我的接口说明文档模板

    一个良好的接口说明文档模板能够确保所有相关人员对接口的理解一致,提高开发效率并减少错误。以下是对"我的接口说明文档模板"的详细解释: 1. **接口文档模板的重要性** - 文档清晰:接口文档提供了接口的功能...

    接口模板.docx

    **接口模板文档说明** 1. **引言** 1.1 编写目的 本文档的主要目的是为了提供一套完整的接口模板,用于指导开发者在Java环境下进行API设计和开发工作。它详细阐述了接口协议的标准、接口地址以及请求响应的规范,...

Global site tag (gtag.js) - Google Analytics