2016-09-21 5 views
1

kaaサーバに通知を送信したい。以下のcURLコマンドは問題なく動作していますが、node.jsサーバーからPOSTリクエストを送信したいとします。親切にも、投稿要求に変換する際に助けてください。kaaサーバに通知を送信する要求を投稿するためにcURLコマンドを変換する

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

私は取得しています:私はこのような試みた

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

エラー400必須の要求部 '通知' は存在しません。

答えて

3

ここに解決策があります。

最初に次のモジュールをインポートします。

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

私たちは、マルチパートコンテンツタイプと生のPOSTリクエストのボディを構築するために他のために境界を生成するために、2つのユーティリティ関数が必要です。

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 Serverに送信します。 send notification

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

結局のところ、あなたはステータスコード私はKAAサンドボックスからの通知のデモでテストコード全体でファイルを添付して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 
} 

と確認応答が表示されます。

+0

あなたは素晴らしいです。どうもありがとうございます。 –

関連する問題