json json-rpc 如何在项目中的使用心得

部分转自:http://www.cnblogs.com/legoras/articles/1328620.html

Joyrock简介:

Joyrock是一个基于LGPL协议的开源项目,实现了JSON和JSON-RPC,支持微软ASP.NET框架。它方便我们读取从浏览器流向服务器的JSON对象,也方便在响应流中写入JSON对象。
   
Jayrock 远程方法要求写在一个ashx中,页面请求这个ashx的时候,在ProcessRequest
中根据Request对象中的参数信息,确定请求的服务器端方法名称和参数,然后进行调用,并返回结果。
    博客urlhttp://www.cnblogs.com/shanyou/archive/2007/07/01/802213.html 
   
官方简介url
http://jayrock.berlios.de/

前面几篇博客中有几篇关于EXT的例子,其中有提到过,关于JSON对象在前后台的传递,以及项目业务逻辑类在JS中注册的方式。这些将以这篇文章作为契子,引出一系列相关的博客,它们是我最近学习的东西。

当我有将产品的前台全部使用EXT的想法时,如何最大程度地利用到现有框架,便成了最迫切需要解决的问题:

1. 现在框架集成了异常处理、日志、事务、工具类等模块,相对稳定。

2. 如果使用AJAX,还需要重新写一套数据访问层,那是没人愿意做的事情。

3. 客户端与服务端之间对象序列化与传递是个问题。

第1、2个问题,就涉及到服务端业务逻辑类的远程调用,如JSON-RPC;而第3个问题,使用JSON封装吧。关于XML格式与JSON的比较,网上有很多文章,在此不獒叙。

Joyrock示例:配置一个的例子非常简单,首先你需要下载到它的包,官方网站:http://developer.berlios.de/project/showfiles.php?group_id=4638,这是一个台湾的站点,速度可能有点慢。我把其中必须的Jayrock.dll、Jayrock.Json.dll与json.js放到csdn资源站点上,url为http://download.csdn.net/source/405504

在项目中,将Jayrock.dll与Jayrock.Json.dll引用进来,在页面中,将json.js文件包含进来(<script
type="text/javascript" src="filepath/json.js"></script>)。

Jayrock的远程方法,需要写在一个“一般资源文件”(.ashx)内:

<%@ WebHandler Language="C#" Class="Handler" %>

using System;
using System.Web;
using Jayrock.Json;
using Jayrock.JsonRpc;
using Jayrock.JsonRpc.Web;

public class Handler : JsonRpcHandler
{
    [JsonRpcMethod("greetings")]
    public string Greetings()
    {
        return "Welcome to Jayrock!";
    }
}

你可以在这层访问你的业务逻辑。如此,页面上引入json.js与.ashx文件:

<script type="text/javascript" src="../Common/Js/json.js"></script>
<script type="text/javascript" src="Handler.ashx?proxy"></script>

便可以在js中直接new Handler对象,并访问greetings方法了。

var s = new Handler(); 
        alert("sync:" + s.greetings()); 
        s.greetings(function(response) { 
               alert("async:" + response.result) 
        }
);

补充一:我朋友的公司开发一个开源产品,关键技术基于一个开源项目,在产品发布前才了解到,这个开源项目基于GPL协议,那么他们的产品也必须开源,必须继承GPL协议,如此,没有任何商机可言。

如果你在开发项目或者产品时,对开源协议需要一定的了解。

LGPL开源协议——LGPL
是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。LGPL允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并发布和销售。

GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品。

常见的开源协议:BSD、GPL、LGPL、MIT(前面4种通过ISO批准)、Apach Licene 2.0

来源:Javaeye上一篇关于开源协议的帖子《开源协议详解》,地址没有了,去javaeye搜索吧。

补充二:常用的.net下ajax框架(动态连接库Ajax.dll),同样实现了远程调用,但B、S端之间的数据传递没有使用Json格式,而传递DataTable(在js端序列化成为了数组对象)。关于它的配置,将在后续博客中,放出来。

与Jayrock的比较:个人觉得Jayrock需要一段时间熟悉它的API,而且相对来说网上的资料较少。Ajax.dll在序列化List(包含数据模型Model)时,处理比较麻烦,至少我现在还没能实现。

-------------------华丽分割线-----------------

下面是使用心得:

我们是将zabbix作为我们的主host,再去通过其api做减法获取我们想得到的。

zabbix
api:https://www.zabbix.com/documentation/2.2/manual/api/reference/host/get

下面是demo:

建立Handler.ashx文件:


namespace WebJson
{
/// <summary>
/// Summary description for Handler
/// </summary>
public class Handler :JsonRpcHandler
{
static string auth = string.Empty;
RequestInfo requestInfo = null;
Request request = null;
public Handler()
{
request = new Request();
requestInfo = new RequestInfo();
requestInfo.RequestUri = "http://gamecloudservice.chinacloudapp.cn/zabbix/api_jsonrpc.php";
requestInfo.Method = "POST";
requestInfo.ContentType = "application/json-rpc";
}

[JsonRpcMethod("greetings")]
public string Greetings() {
return @"{‘jsonrpc‘:‘2.0‘,‘result‘:‘0424bd59b807674191e7d77572075f33‘,‘id‘: 1}";
}

//[JsonRpcMethod("login")]
//public string GetLogin()
//{
// //{‘jsonrpc‘: ‘2.0‘,‘method‘: ‘user.login‘,‘params‘: {‘user‘: ‘Admin‘,‘password‘: ‘!QAZ1qaz‘},‘id‘: 1}

// LoginParams param = new LoginParams();
// param.user = "Admin";// Login message = new Login();
// message.jsonrpc = "2.0";
// message.method = "user.login";
// message.aparams = param;
// message.id = 1;

// string jsonData = JsonConvert.SerializeObject(message).Replace("aparams", "params");
// return request.RequestSend(requestInfo, jsonData);
//}

public void GetLogin()
{
//{‘jsonrpc‘: ‘2.0‘,‘method‘: ‘user.login‘,‘params‘: {‘user‘: ‘Admin‘,‘password‘: ‘!QAZ1qaz‘},‘id‘: 1}

LoginParams param = new LoginParams();
param.user = "Admin";

Login message = new Login();
message.jsonrpc = "2.0";
message.method = "user.login";
message.aparams = param;
message.id = 1;

string jsonData = JsonConvert.SerializeObject(message).Replace("aparams", "params");

string result = request.RequestSend(requestInfo, jsonData);
LoginReturnModel m = JsonConvert.DeserializeObject<LoginReturnModel>(result);
auth = m.result;
}

[JsonRpcMethod("host")]
public string GetHost()
{
if (String.IsNullOrWhiteSpace(auth))
GetLogin();

HostFilter filter = new HostFilter();
filter.host = new string[] { "Zabbix server" };

HostParams param = new HostParams();
param.output = "extend";
param.filter = filter;

Host host = new Host();
host.jsonrpc = "2.0";
host.method = "host.get";
host.aparams = param;
host.auth = auth;
host.id = 1;

string jsonData = JsonConvert.SerializeObject(host).Replace("aparams", "params");
return request.RequestSend(requestInfo, jsonData);
}
}
}

这里对应了2个方法是用API:login,和获取 host.

执行webrequest的类:


namespace WebJson
{
public class Request
{
public String RequestSend(RequestInfo requestInfo, String jsonData)
{
String strResult = String.Empty;
try
{
Byte[] bytes = Encoding.UTF8.GetBytes(jsonData);
Uri requestUri = new Uri(requestInfo.RequestUri);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
request.Method = requestInfo.Method;
request.ContentType = requestInfo.ContentType;
request.ContentLength = bytes.Length;
Stream reqstream = request.GetRequestStream();
reqstream.Write(bytes, 0, bytes.Length);
request.Timeout = 5000;

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (Stream streamReceive = response.GetResponseStream())
{
using (StreamReader streamReader = new StreamReader(streamReceive, Encoding.UTF8))
{
strResult = streamReader.ReadToEnd();
}
}
}
catch (WebException exWeb)
{
using (Stream responseStream = exWeb.Response.GetResponseStream())
{
using (StreamReader streamReader = new StreamReader(responseStream))
{
HttpStatusCode statusCode = ((HttpWebResponse)exWeb.Response).StatusCode;
String statusMessage = String.Format("{0} - {1}"
, (int)((HttpWebResponse)exWeb.Response).StatusCode
, ((HttpWebResponse)exWeb.Response).StatusCode.ToString());
XDocument docMessage = XDocument.Load(streamReader);
}
}
}
return strResult;
}
}

public class RequestInfo
{
public string RequestUri { get; set; }
public string Method { get; set; }
public string ContentType { get; set; }
}
}

建立3个对应的messageModel:

通过引入Json.net适配request json和response json.

前端建立一个index.html的作为触发json-rpc获取数据前端画图:


<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<script type="text/javascript" src="CommonLib/json.js"></script>
<script type="text/javascript" src="Handler.ashx?proxy"></script>
<script type="text/javascript">
window.onload = function () {
var s = new Handler();
alert("sync:" + s.host());
//s.greetings(function (response) {
// alert("async:" + response.result)
//}
//);
}
</script>
</head>
<body>
hello world!
</body>
</html>

时间: 2024-10-05 04:58:07

json json-rpc 如何在项目中的使用心得的相关文章

项目中的小心得(以后慢慢积累起来)

       1:变量,对象只声明了,而没有初始化 是不能用,不能来装东西的!!! 谨记谨记!!!!       2:两个头文件不能相互的包含,会造成循环引用,解决办法:在其中的一个头文件中的类用@class引用: 项目中的小心得(以后慢慢积累起来)

C语言关键字register、extern、static、一些总结,及项目中使用的心得

首先介绍两个概念: 一.变量的生存周期: 变量从建立到撤销的时间段成变量的生存周期.静态变量,从变量产生到整个程序执行结束.当函数使用变量结束后,变量的存储空间依然存在,变量的值也会随着函数的对其的使用而改变.如在函数内定义了一个static变量,那第一次调用该函数后,该变量的值将会被保留,当第二次被调用时,该变量的值还是第一次调用结束时的值.动态变量,顾名思义,变量的存储空间是随着函数的调用动态产生和撤销的.如,在一个函数里定义了动态变量,变量的周期指从变量建立到函数结束,而不是这个程序结束.

项目中如何使用babel6详解

由于浏览器的版本和兼容性问题,很多es6,es7的新的方法都不能使用,等到可以使用的时候,可能已经过去了很多年.Babel可以把es6,es7的新代码编译成兼容绝大多数的主流浏览器的代码. 本篇文章主要介绍在项目中如何安装配置和使用babel. 1.在项目下初始化 package.json $ npm init 2.在项目中安装babel $ npm install babel-cli --save-dev 3.安装babel插件 $ npm install babel-preset-xxxxx

项目中的web api知识总结

最近在做公司的项目,自己负责webapi的框架的搭建与开发,最近很忙,一直没时间对工作中遇到的知识点缺少个总结,现总结一下,对自己是个提升,如果个人的小点点小总结能对博友有帮助那也是善莫大焉. (1). 首先说一下c# dynamic,dynamic是FrameWork4.0的新特性.我在api中用了比较多的dynamic,首先个人认为dynamic能使代码变得优雅,可以省去定义多余的实体,dynamic是运行时决定类型有哪些属性,包括赋值和取值都可以随便指定属性, 例如: dynamic so

在项目中学习.NET的json(一)

项目实现功能: 1.使用工具:json在线解析器.(C# Newtonsoft.Json类库源码包源代码:JObjectTests.cs-好库网) 2.前台:在文本框中输入内容,点击添加按钮后把输入内容显示table表格中(可添加多行),最后提交. 3.思路解析:首先在添加之前验证所添加的内容,添加后在验证所添加的内容之后,添加内容到table表格tr中,再次点击添加除了验证所添加的内容外,也要判断添加的内容是否和上一 个添加的内容是否一致,最后提交table表格中的内容. 4.遇到的问题和解决

项目中发现的一些关于JavaScript中JSON的注意点

一个是怎样创建JSON: var obj = {}; obj['name'] = value; obj['anotherName'] = anotherValue; 假设要创建多级的JSON,则: ips[ipId] = {}; ips[ipId]['name'] = value; ips[ipId]['anotherName'] = anotherValue; 注意要用bracket[]而不能用点. 来訪问json object bracket尽管写起来麻烦一些,可是能够避免非常多错误! ht

json在项目中的应用大总结

一.摘要 刚开始接触json的时候,那时候还不太清楚json到底是个什么东西,然后就在项目中使用了它.因为没有搞明白json的本质,所以刚开始使用json的时候走了不少弯路.这次总结一些json的知识,总结主要是想梳理一下自己使用json的一些应用场景,让自己对json有一个更深刻的认识,以后在项目中可以更加熟练的应用它. 二.总结: 1.json在前端中的应用: a)ajax+json使用场景: ajax处理登录验证信息  解析json格式的String类型对象和ajax获得服务端的响应数据的

IT项目中使用 json格式数据 保存项目配置信息, 在配置文件再读取json文件的内容进行赋值

json格式小巧玲珑,适合做配置文件,特别是大型项目中, 可以将配置信息分类保存到不同的json文件中, 然后再在配置文件中读取配置文件的数据进行赋值, 这里以python为例进行说明: 假设在yourfile.json文件中保存了如下信息: { "user_message":{ "name":"lowman", "age":"14", }, "database":{ "USE

iOS项目中Json转Model的坑

Json转Model json转model,是个开发都会遇到过.都已经9102年了,谁还不会用个第三方框架搞.拿起键盘就是干!打开podfile,把大名顶顶的YYModel写上,pod install一下.再用上ESJsonFormat,直接根据json,都能把model生成好. 特殊处理 啥?返回的字段值不是我们所需的在日常开发中,经常会遇到一些接口字段返回的值,并不是我所需要的类型的情况,这个时候,我们都会对这个字段进行处理.举个栗子: 123456 /** 错误代码 */@property