- 世界上最悲剧的事就是打开钱包之后,毛主席不在了,各族人民还在。。
月度归档: 2014年5月
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表示的吧。
我打开电视的原因
- 我打开电视的原因
面向对象编程
- 这才是面向对象编程
- 舌尖3
emacs的xml-rpc的小补丁一个,解决无法post到godaddy站点
接到电信总部通知,说根据XX规定,不允许我将域名绑到自己的宽带上,不然就停封帐号
算一算,绑定了好几周,只是最近为了学习org-mode,所以发了一大堆图片,然后就立 刻接到电话了,话说我找他们办事的时候就没这么快。
因此,我在godaddy买了个空间,整个过程还顺利,不一会就将所有的切换到新的空间上了
然后,测下速度,也还算满意,比我自己家里快。然后,接着使用emacs测试下看能否 正常发blog了。
悲剧出现, org2blog在登录的这一步,一直说404错误,而在我的其他的任何一个环境中测试,都很正常
找遍了网络,升级xml-rpc.el,配置服务器这个,配置服务器那个,修改xmlrpc.php,都找不到解决方式, 我甚至都给godaddy发送邮件,询问是不是服务器是不是有什么限制了,趁着等邮件的 时候,研究org2blog的代码调用,研究到xml-rpc.el,打开调试,看最终发送的是什么。然后使用 curl模拟发送,结果没想到curl竟然可以发送成功,然后各种测试,模拟,不管哪个头 标识,curl模拟下来都非常正常,但 emacs死活是不行
我非常的生气,后果很严重,于是,决定看看网络传输的到底是什么数据
下载windump(我在windows机器上,ubuntu 12.04上的那个emacs版本太低,还需要重新 配置),研究windump的使用方式,然后dump数据,分析emacs发送数据和curl的区别,真 的要弄瞎我的近视眼啊
一个字段一个字段的比较下来,都没问题,字段都一样,只是顺序不一样,我觉的这个不是问题
一遍又一遍,甚至我都想要测试回车符有没有影响了,突然,我注意到emacs比curl多了一个字段
“Connection: keep-alive”, 在curl这边,这个值只出现了一次,而在emacs这边,这 个值出现了两次,也就是说,某个地方设置了两次,难道这个?我都在怀疑自己的判断 了。
瞎猫碰死耗子吧,我修改了下xml-rpc.el,结果,它居然正常了。
看来问题就出现在两次”Connection: keep-alive”上,于是,就有了以下的补丁(我用 的是1.6.7,最新的可能是1.6.8)
diff --git a/xml-rpc.el b/xml-rpc.el index 16c4cb1..bb23ecb 100644 --- a/xml-rpc.el +++ b/xml-rpc.el @@ -13,7 +13,7 @@ ;; Keywords: xml rpc network ;; URL: http://emacswiki.org/emacs/xml-rpc.el ;; Maintained-at: http://savannah.nongnu.org/bzr/?group=emacsweblogs -;; Last Modified: <Zhang_Ze 2009-12-15 16:51:25> +;; Last Modified: <--==RIX==-- 2014-05-24 22:29:52> ;; This file is NOT (yet) part of GNU Emacs. @@ -521,7 +521,7 @@ or nil if called with ASYNC-CALLBACK-FUNCTION." (url-request-coding-system xml-rpc-use-coding-system) (url-http-attempt-keepalives t) (url-request-extra-headers (list - (cons "Connection" "keep-alive") + ;(cons "Connection" "keep-alive") (cons "Content-Type" "text/xml; charset=utf-8")))) (when (> xml-rpc-debug 1)