`

最新基于Json 协议的架构

 
阅读更多
package util;

import java.util.HashMap;
import java.util.Map;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.codehaus.jackson.map.ObjectMapper;

public class Test {
	private static ObjectMapper mapper = new ObjectMapper();

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Map<String, Object> p = new HashMap<String, Object>();
		p.put("username", "rzy阮智勇");
		p.put("pwd", "111111");
		Object result = call("PmsService.test", p, 1, 5);
		System.out.println("===" + result);
	}

	public static Object call(String sid, Object... args) {
		String url = "http://localhost:8080/PMS/handler";
		String result = null;
		HttpClient client = new DefaultHttpClient();
		try {

			HttpPost post = new HttpPost(url);
			post.addHeader("api", sid);
			StringEntity s = new StringEntity(mapper.writeValueAsString(args),
					"UTF-8");
			s.setContentType("application/json");
			post.setEntity(s);

			HttpResponse res = client.execute(post);
			if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
				HttpEntity entity = res.getEntity();
				result = EntityUtils.toString(entity);
			}
		} catch (Exception e) {
			throw new RuntimeException("请求失败", e);
		} finally {
			client.getConnectionManager().shutdown();
		}
		return result;
	}

}

 

package util;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.MethodUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.codehaus.jackson.map.ObjectMapper;

@SuppressWarnings("serial")
public class Handler extends HttpServlet
{
    ServletContext context;
    static ObjectMapper mapper = new ObjectMapper();
    static Logger log = Logger.getLogger(Handler.class);

    @Override
    public void init(ServletConfig config) throws ServletException
    {
        this.context = config.getServletContext();
        super.init(config);
    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException,
            IOException
    {
        ServiceContext sc = ServiceContext.begin(this.context, request, response);
        response.setContentType("application/json;charset=utf-8");
        Object result = null;
        String api = request.getHeader("api");
        String url = request.getRequestURI();
        Object[] args = mapper.readValue(request.getInputStream(), Object[].class);
        String className = StringUtils.substringBeforeLast(api, ".");
        String methodName = StringUtils.substringAfterLast(api, ".");
        String packageName = StringUtils.substringAfterLast(url, "/");
        log.debug("api==>" + api);
        for (int i = 0, len = args.length; i < len; i++)
        {
            log.debug("Parameter" + i + "==>" + args[i]);
        }
        try
        {
            Class cls = Class.forName(packageName + "." + className);

            if (args.length > 0)
            {
                Class[] parameterTypes = new Class[args.length];

                for (int i = 0, j = args.length; i < j; i++)
                {
                    parameterTypes[i] = args[i].getClass();
                }
                result = MethodUtils.invokeMethod(ServiceFactory.getService(cls), methodName, args, parameterTypes);
            }
            else
            {
                result = MethodUtils.invokeMethod(ServiceFactory.getService(cls), methodName, null);
            }

            if (result != null)
            {
                log.debug("Result==>" + result);
                mapper.writeValue(response.getWriter(), result);
            }
        }
        catch (ClassNotFoundException e)
        {

            log.debug("Exception in service.");
            log.debug("service未发现" + e.getCause().getMessage());
        }
        catch (NoSuchMethodException e)
        {

            log.debug("Exception in service.");
            log.debug("service对应的方法未发现" + e.getMessage());
        }
        catch (InvocationTargetException e)
        {

            log.debug("Exception in service.");
            Throwable t = e.getCause();
            if (t instanceof DataAccessException)
            {
                String error = "database exception." + t.getMessage();
                mapper.writeValue(response.getWriter(), error);
                log.debug(error);
            }
            else
            {
                log.debug(t.getMessage());
            }
        }
        catch (Exception e)
        {

            log.debug("Exception in service." + e.getCause().getMessage());
        }
        finally
        {
            if (sc != null)
            {
                sc.end();
            }
        }
    }
}

 

package util;

import java.lang.reflect.Method;
import java.util.regex.Pattern;

import net.sf.cglib.proxy.Callback;
import net.sf.cglib.proxy.CallbackFilter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.NoOp;

import org.apache.log4j.Logger;

public class ServiceFactory
{

    static Logger log = Logger.getLogger(ServiceFactory.class);

    static MethodInterceptor interceptor = new MethodInterceptor()
    {
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy methodProxy) throws Throwable
        {
            Object result = null;
            try
            {
                log.debug("事务开始");
                DBUtils.beginTransaction();
                result = methodProxy.invokeSuper(obj, args);
                log.debug("事务提交");
                DBUtils.commitTransaction();
                
                
                StringBuffer logs = new StringBuffer();
                String api = ServiceContext.getHeader("api");
                String username = ServiceContext.getHeader("username");
                String ip = ServiceContext.getIP();
                String time = Utils.now("yyyy-MM-dd HH:mm:ss");
                logs.append(username).append("|");
                logs.append(ip).append("|");
                logs.append(time).append("|");
                logs.append(api).append("|");
                logs.append(1).append("|");
                logs.append("memo");
                LogHandler.put(logs.toString());
            }
            catch (Exception e)
            {
                log.debug("事务回滚");
                DBUtils.rollbackTransaction();
                throw e;
            }
            return result;
        }
    };

    static CallbackFilter filter = new CallbackFilter()
    {
        public int accept(Method arg0)
        {
            return Pattern.compile("^(add|del|mod|set|reg|active|cancel)").matcher(arg0.getName()).find() ? 0 : 1;
        }
    };

    @SuppressWarnings("unchecked")
    public static <T> T getService(Class<T> cls)
    {
        try
        {
            Enhancer en = new Enhancer();
            en.setSuperclass(cls);
            en.setCallbacks(new Callback[] { interceptor, NoOp.INSTANCE });
            en.setCallbackFilter(filter);
            return (T) en.create();
        }
        catch (Exception e)
        {
            log.debug("Create " + cls.getSimpleName() + " Failure!");
            e.printStackTrace();
            return null;
        }
    }
}

  

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    一种基于JSON的分布式系统架构.pdf

    通过上述知识点的阐述,我们可以看到基于JSON的分布式系统架构为当前技术背景下的分布式系统设计提供了一个高效、轻量、跨平台的解决方案。随着技术的不断进步和应用场景的扩展,这些知识点在未来的技术发展中仍然...

    STM32上json协议解析代码

    STM32上json协议解析代码主要涉及了嵌入式系统中的微控制器编程、串行通信、传感器控制以及数据解析等多个方面。STM32是意法半导体(STMicroelectronics)推出的一种基于ARM Cortex-M内核的微控制器系列,以其高性能...

    一种基于JSON的智能家居协议栈设计.pdf

    本篇文档介绍了一种基于JSON格式的智能家居协议栈的设计。该协议栈旨在解决智能家居行业存在的多种问题,包括低速率、低时延和设备异构性问题。文中提到的JSON是一种轻量级的数据交换格式,以文本形式存储,易于人们...

    基于php扩展swoole封装的一个简易的JSON协议的RPC框架

    本项目则是在Swoole的基础上,构建了一个基于JSON协议的远程过程调用(RPC)框架。通过此框架,开发者可以轻松地实现服务间的通信,提高系统的可扩展性和解耦性。 【描述】 这个简易的JSON-RPC框架是作者自己的实践...

    jsonrpc-c-master 基于 json rpc 1.0 纯C开发的服务端代码和示例

    基于JSON-RPC 1.0的C语言实现,如"jsonrpc-c-master",提供了一种在C语言环境中构建服务端应用的方法,尤其适用于嵌入式系统或对性能有严格要求的环境。 **JSON-RPC 1.0协议基础** JSON-RPC 1.0是一个简单的请求/...

    基于JSON-REST-HTTP架构用于房间温度监控的Android软件

    总的来说,这个基于JSON-REST-HTTP架构的Android温度监控应用,利用了Android平台的网络库与服务器进行数据交换,服务器端通过Java EE提供了RESTful API,实现了远程监控房间温度的功能。这样的系统设计使得客户端...

    基于python实现的http+json协议接口自动化测试框架

    【标题】基于Python实现的HTTP+JSON协议接口自动化测试框架 在软件开发过程中,接口测试是确保系统间数据传输正确性和系统集成稳定性的重要环节。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,而...

    OCPP json 国际充电开发协议

    在实施过程中,开发者需要区分OCPP-S(基于SOAP的实现)和OCPP-J(JSON的实现),并使用不同的后缀(-S或-J)来区分这两种协议。这是为了在通信时避免对实现类型的误解。 OCPP JSON 1.6协议的主要内容包括: 1. ...

    基于JSON格式的强结构型文档数据交换协议jxt设计源码

    jxt(JSON Text)是一个针对强结构型文档数据交换的开放性表示协议,采用PHP、HTML和JavaScript进行开发,源码包含95个文件,其中72个HTML文件、10个JavaScript文件、8个PHP文件、2个Git忽略文件和1个Markdown文件。...

    第34讲 基于JSON的RESTful接口协议:我不关心过程,请给我结果1

    【基于JSON的RESTful接口协议】是现代Web服务设计中广泛采用的一种标准,它强调简洁、直接的交互方式,尤其适合互联网应用。REST(Representational State Transfer,表述性状态转移)是一个架构风格,由Roy ...

    APIJSON是一种为API而生的JSON网络传输协议以及基于这套协议实现的ORM库

    4. 自动校验:APIJSON协议允许定义字段的校验规则,如类型、长度、范围等,可以自动进行数据验证,确保输入的合法性和安全性。 5. 动态SQL:APIJSON的ORM库支持动态SQL,可以根据请求参数自动生成合适的SQL语句,...

    Json协议下数据的序列化和反序列化的动态链接库和教程

    在本文中,我们将深入探讨JSON协议下的数据序列化和反序列化,以及如何利用动态链接库和教程来高效地操作JSON数据。 **一、JSON数据序列化** 数据序列化是指将数据结构或对象转换为可传输或存储的格式。在JSON中,...

    34基于JSON的RESTful接口协议:我不关心过程,请给我结果1

    【基于JSON的RESTful接口协议】是现代Web服务设计中广泛采用的一种标准,它强调简洁、直接的交互方式。REST,即表述性状态转移(Representational State Transfer),是由Roy Fielding在其博士论文中提出的架构风格...

    基于json的异构数据库整合研究--大学毕业论文.doc

    其中,基于JSON的整合方式通过映射机制,将不同数据库的数据结构转化为统一的JSON格式,从而实现数据交换。 3.1 JSON的解码与编码 JSON的解析是整合过程的关键步骤,包括将JSON字符串转化为Java对象(POJO,Plain ...

    cJSON.rar_cjson_json c++ 简单_json 协议_json数据传输

    2. cJSON源代码文件(如`cjson.c`):实现了cJSON库的功能,包括解析JSON字符串、创建JSON对象、遍历JSON结构等功能。 3. 测试用例:可能包含一个或多个示例程序,用于验证cJSON库的正确性,开发者可以通过运行这些...

    APIJSON 是一种专为 API 而生的 JSON 网络传输协议 以及 基于这套协议实现的 ORM 库

    APIJSON 是一种专为 API 而生的 JSON 网络传输协议 以及 基于这套协议实现的 ORM 库。 为各种增删改查提供了完全自动化的万能通用接口,零代码实时满足千变万化的各种新增和变更需求。能大幅降低开发和沟通成本,...

    iotagent-json:IoT Agent,用于基于JSON的协议(带有HTTP,MQTT和AMQP传输)

    FIWARE IoT Agent,用于基于JSON的协议 物联网代理,用于基于JSON的协议(带有 , 和传输)。 该IoT代理旨在与上下文代理的接口之间的桥梁。 它基于IoT Agent Node.js库。 有关FIWARE IoT代理框架,其体系结构和公共...

    swift-Marshal简单有效可读性高基于协议编程的JSON解析库

    Swift中的Marshal库是一款高效、易读且基于协议编程的JSON解析工具,专为提升Swift开发者在处理JSON数据时的体验而设计。它充分利用了Swift语言的强类型特性和协议扩展功能,提供了简洁的API,使得JSON序列化和反...

    一个基于 JSON-Patch 的对象同步的 JSON-RPC 服务器.zip

    本项目是一个基于 C# 实现的 JSON-RPC 服务器,它利用 JSON-Patch 来实现对象的同步。 首先,我们需要理解 JSON-Patch。JSON-Patch 是一种标准(RFC 6902),它定义了一种操作序列,这些操作可以应用于 JSON 对象来...

    OCPP 1.6 JSON格式

    1. **命令框架**:OCPP协议基于命令模型,包括客户端(充电站)向服务器(充电网络管理系统)发送的请求(Request)和服务器回应的响应(Response)。JSON格式用于封装这些命令,例如“BootNotification”,...

Global site tag (gtag.js) - Google Analytics