Search code examples
node.jsrestcurlkaa

Convert cURL command to post request to send notification to kaa server


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.


Solution

  • 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.