问题可能在于实际的客户端,但是他没有在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"
}
]
}
]
}
答案 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函数。