1

I want to send a notification to kaa server. The below cURL command is working fine but I want to send POST request from my node.js server. Kindly help me in converting to post request.

  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

I tried like this:

 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);
    }
});

I am getting: Error 400 Required request part 'notification' is not present.

Yasin Patel
  • 5,624
  • 8
  • 31
  • 53
Vivek Shah
  • 15
  • 1
  • 5

1 Answers1

2

Here is a solution.

First import next modules.

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

We need two utility functions to generate boundary for multipart content type and the other to build raw POST request body.

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;
}

Then we form our data and generate the boundary.

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();

After that compose a request and send to Kaa Server.

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);
    }
});

After all, you will see the confirmation response with status code 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
}

I attach the file with whole code that I tested on Notification Demo from Kaa sandbox: send notification.

Kirill Liubun
  • 1,965
  • 1
  • 17
  • 35