Convert cURL command to post request to send notification to kaa server
Question: 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.


Answer: 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](https://drive.google.com/file/d/0B8XVYCfGBxs3THZaYzYtSUZYV2s/view?usp=sharing).

