mochiweb与cowboy使用json

服务器原来的socket实现机制更改为ranch了,这样可以专注维护自己的事情了。其实,之 所以采用ranch是因为我使用bigwig来在网页中对状态进行监控,而bigwig使用的是cowboy 和ranch,cowboy也使用的是ranch,这样,代码中就存在了两个http的框架,mochiweb和 cowboy,而看了ranch的结构,感觉很不错,就将socket服务器也转换为基于ranch架构了。 mochiweb单独一个模块来进行http服务感觉重复,因此就决定将mochiweb从模块中去除,转 为cowboy。

一切基本都很顺利,但服务器和网页的数据交互总是有问题,数据交互使用的是json格式, mochiweb带有自己的将erlang数据转换为json的方法,cowboy使用的jsx,代码分别为

mochijson2:encode([{success, true}, {root, []}]),
jsx:term_to_json([{success, true},{root, []}]),

看上去很一致吧,我也以为不会有什么大问题,然后碰到了下面的格式

Data=[{"ID", 1},
      {<<"name">>, <<"zhangsan">>
}].

mochiweb侧输出的是:

“{\”ID\”:1,\”name\”:\”zhangsan\”}”

而jsx侧输出的是:

“[{\”_type\”:\”tuple\”,\”data\”:[\”ID\”,1]},{\”_type\”:\”tuple\”,\”data\”:[\”name\”,\”zhangsan\”]}]”

如果想要和mochiweb输出表现一致的话,Data需要使用下面的方式:

% 方法1(推荐)
Data=[{<<"ID">>, 1},
      {<<"name">>, <<"zhangsan">>
}].
%方法2
Data2=[{'ID', 1},
      {'name', <<"zhangsan">>
}].

很明显不是我想要的数据,通过调查,发现jsx有以下的限制:

作为json索引的字段名称,不能是字符串list,如果为atom或者binary,则和mochiweb的输出 一致,也基本上和理解上一致,如果为字符串list,则jsx认为这个是一个数组,这可能是 因为erlang并没有真正意义上的字符串,字符串在erlang中是用list表示的吧。

mnesia使用中文创建数据库并支持REST操作

这个不是什么高深的内容,记录下来,给自己提个醒。

起源于我想给我的所有数据库添加一个统一的操作接口,当然,使用英
文会更方便,更批量化,代码更少等等,我在弄的时候突发奇想,使用中
文吧,这样网页中看着连想都不用想,而且还可以给别人看,连教育部都
不支持中文了,杂家也随下大流。

其实erlang的record完全支持中文的声明,比如下面的例子:

      -record('公告',
        {'ID', %ID
         '标题' = "", % 标题
         '内容' = "", % 描述
         '显示' = true% 禁用
        }).
      

只所以可以成功是因为单引号的字符串,在erlang中就是作为一个atom
类型的,如果你想给里面加个空格什么的,也没问题。当然,使用的时候也
要加上单引号。

其实,erlang的record使用中文的话,也就上面的这些。但如果在shell
中使用,就比较烦人了,在命令行下使用下面的语句:

     mnesia:transaction(fun() -> mnesia:match_object('公告') end)).
     

会出现:illegal atom 的错误,或许修改环境变量的编码可以修改,我
没有测试。

接下来是http的REST接口,一般都使用的是表格显示,我喜欢使用JSON数
据格式,这个就更简单些了。还是上面的record:

继续阅读mnesia使用中文创建数据库并支持REST操作