1

我想向 kaa 服务器发送通知。下面的 cURL 命令工作正常,但我想从我的 node.js 服务器发送 POST 请求。请帮助我转换为发布请求。

  curl -v -S -u devuser:devuser123 -F'notification=
{"applicationId":"32769","schemaId":"32778","topicId":"32770","type":"USER"};
type=application/json' -F file=@notification.json "http://localhost:8080/kaaAdmin/rest/api/sendNotification" | python -mjson.tool

我试过这样:

 var notificationValue= {"applicationId":"32769","schemaId":"32778","topicId":"32770","type":"USER"};
var file = 'notification.json';
var opts = {
  url: 'http://localhost:8080/kaaAdmin/rest/api/sendNotification',
  method: 'POST',
  auth: { user: 'devuser', password: 'devuser123' },
  json: true,
  formData: {
             notification: JSON.stringify(notificationValue),
             file : fs.readFileSync(file)
   }

};
request(opts, function(err, resp, body) {
    if(err)
        res.send(err);
    else{
        res.send(body);
    }
});

我收到:错误 400 所需的请求部分“通知”不存在。

4

1 回答 1

2

这是一个解决方案。

首先导入下一个模块。

var fs = require('fs');
var request = require('request');
var crypto = require('crypto');

我们需要两个实用函数来为多部分内容类型生成边界,另一个用于构建原始 POST 请求正文。

var CRLF = "\r\n";
var md5 = crypto.createHash('md5');

function multipartRequestBodyBuilder(fields, boundary) {
    var requestBody = '';   
    for(var name in fields) {
        var field = fields[name];
        var data = field.data;  
        var fileName = field.fileName ? '; filename="' + field.fileName + '"' : ''; 
        var type = field.type ? 'Content-Type:' + field.type + CRLF : ''; 
        requestBody +=  "--" + boundary + CRLF +
                "Content-Disposition: form-data; name=\"" + name + "\"" + fileName + CRLF + 
                 type + CRLF +
                 data + CRLF;
    }
    requestBody += '--' + boundary + '--' + CRLF
    return requestBody;
}

function getBoundary() {
    md5.update(new Date() + getRandomArbitrary(1, 65536));
    return md5.digest('hex');
}

function getRandomArbitrary(min, max) {
  return Math.random() * (max - min) + min;
}

然后我们形成我们的数据并生成边界。

var notificationValue = {
    "applicationId":"2",
    "schemaId":"12",
    "topicId":"1",
    "type":"USER"
 };


var postData = {
    notification : {
        data : JSON.stringify(notificationValue), 
        type : "application/json"
    },
    file : {
        data : fs.readFileSync("message.json"), 
        fileName : 'notification.json',
        type : 'application/octet-stream'
    }
}


var boundary = getBoundary();

之后编写一个请求并发送到 Kaa 服务器。

var opts = {
  url: 'http://localhost:8080/kaaAdmin/rest/api/sendNotification',
  method: 'POST',
  auth: { user: 'devuser', password: 'devuser123' },
  headers: {
    'content-type': 'multipart/form-data; boundary=' + boundary
  },
  body :  multipartRequestBodyBuilder(postData, boundary)
};

request(opts, function(err, resp, body) {
    if(err) {
        console.log("Error: " + err);
    } else {
        console.log("Satus code: "  + resp.statusCode + "\n");
        console.log("Result: " + body);
    }
});

毕竟,您将看到状态码为 200 的确认响应。

Status code: 200

Result: {
  "id" : "57e42623c3fabb0799bb3279",
  "applicationId" : "2",
  "schemaId" : "12",
  "topicId" : "1",
  "nfVersion" : 2,
  "lastTimeModify" : 1474569763797,
  "type" : "USER",
  "body" : "CkhlbGxvAA==",
  "expiredAt" : 1475174563793,
  "secNum" : 17
}

我附上了我在 Kaa 沙箱的 Notification Demo 上测试的整个代码的文件:发送通知

于 2016-09-22T18:46:31.390 回答