Node.js - 无法使用Fermata REST客户端将嵌套/转义的JSON发布到正文

时间:2011-06-21 17:21:11

标签: javascript json node.js

问题可能在于实际的客户端,但是他没有在github上做出响应,所以我会给它一个机会!

我正试图在体内发布嵌套的JSON:

{
   "rowkeys":[
      {
         "rowkey":"rk",
         "columns":[
            {
               "columnname":"cn",
               "columnvalue":"{\"date\":\"2011-06-21T00:53:10.309Z\",\"disk0\":{\"kbt\":31.55,\"tps\":6,\"mbs\":0.17},\"cpu\":{\"us\":5,\"sy\":4,\"id\":90},\"load_average\":{\"m1\":0.85,\"m5\":0.86,\"m15\":0.78}}",
               "ttl":10000
            },
            {
               "columnname":"cn",
               "columnvalue":"cv",
               "ttl":10000
            }
         ]
      },
      {
         "rowkey":"rk",
         "columns":[
            {
               "columnname":"cn",
               "columnvalue":"fd"
            },
            {
               "columnname":"cn",
               "columnvalue":"cv"
            }
         ]
      }
   ]
}

当我删除columnvalue的json字符串时,POST工作。也许有一些关于逃跑的遗漏?我尝试了一些内置的逃生工具无济于事。

var jsonString='the json string above here';

var sys = require('sys'),
      rest = require('fermata'), // https://github.com/andyet/fermata
         stack = require('long-stack-traces');

        var token = ''; // Username
        var accountId = ''; // Password

        var api = rest.api({
             url : 'http://url/v0.1/',
             user : token,
             password : accountId
        });

        var postParams = {
             body: jsonString
        };

        (api(postParams)).post(function (error, result) {
               if (error)
                    sys.puts(error);    

           sys.puts(result);
        });

我发布的API无法反序列化。

{
   "rowkeys":[
      {
         "rowkey":"rk",
         "columns":[
            {
               "columnname":"cn",
               "columnvalue":{
                  "date":"2011-06-21T00:53:10.309Z",
                  "disk0":{
                     "kbt":31.55,
                     "tps":6,
                     "mbs":0.17
                  },
                  "cpu":{
                     "us":5,
                     "sy":4,
                     "id":90
                  },
                  "load_average":{
                     "m1":0.85,
                     "m5":0.86,
                     "m15":0.78
                  }
               },
               "ttl":10000
            },
            {
               "columnname":"cn",
               "columnvalue":"cv",
               "ttl":10000
            }
         ]
      },
      {
         "rowkey":"rk",
         "columns":[
            {
               "columnname":"cn",
               "columnvalue":"fd"
            },
            {
               "columnname":"cn",
               "columnvalue":"cv"
            }
         ]
      }
   ]
}

2 个答案:

答案 0 :(得分:0)

发生同样的双重问题导致我发现处理大型JSON帖子的fermata库存在问题。上面的JSON就好了!

答案 1 :(得分:0)

我认为这里的真正问题是您尝试通过URL参数而不是通过请求正文发布数据。

你正在使用这样的Fermata:

path = fermata.api({url:"http://example.com/path");
data = {key1:"value1", key2:"value2"};
path(data).post(callback);

path(data)代表的内容仍然是一个网址,其中data显示在查询部分中。因此,您的代码将发布到“http://example.com/path/endpoint?key1=value1&key2=value2”并显示空白。

由于您的数据量很大,如果您的网络服务器查看这么长的网址并发回400,我就不会感到惊讶。假设您的API也可以处理POST正文中的JSON数据,那么发送大量数据的更好方法就是使用Fermata代替:

path = fermata.api({url:"http://example.com/path");
data = {key1:"value1", key2:"value2"};
path.post(data, callback);

这会将您的数据作为JSON字符串发布到“http://example.com/path”,这样您就不太可能遇到数据大小问题。

希望这有帮助! Fermata的“神奇之处”在于,除非您传递回调函数,否则您将获得本地URL表示,而不是在其上调用HTTP函数。