Node.js - Невозможно отправить вложенный / экранированный JSON в тело, используя REST-клиент Fermata - PullRequest
1 голос
/ 21 июня 2011

Проблема может быть с реальным клиентом, но он не отвечает на 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"
            }
         ]
      }
   ]
}

Когда я удаляю строку json для columnvalue, 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 голосов
/ 06 июля 2011

Я думаю, что настоящая проблема здесь в том, что вы пытаетесь опубликовать данные через параметр URL, а не через тело запроса.

Вы используете Fermata следующим образом:

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

То, что представляет path(data), по-прежнему является URL-адресом, а data отображается в части запроса. Итак, ваш код публикуется на "http://example.com/path/endpoint?key1=value1&key2=value2" с пустым телом.

Поскольку ваши данные большие, я не удивлюсь, если ваш веб-сервер посмотрит на такой длинный URL-адрес и отправит обратно 400. Предполагая, что ваш API также может обрабатывать данные JSON в теле POST, лучший способ отправить большой объем данных - использовать вместо этого 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 для них.

0 голосов
/ 23 июня 2011

Двойные проблемы, возникающие в то же самое время, привели меня к проблеме с библиотекой fermata, обрабатывающей большие сообщения JSON. JSON выше просто отлично!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...