designetwork

ネットワークを軸としたIT技術メモ

sync-requestモジュール(Node.js)でJSONをPOSTする

f:id:daichi703n:20161119164837j:plain

HTTP GETを同期処理で実行できるsync-requestでPOSTの試験をする。

こちらの記事で、Node.js(JavaScript)のrequstモジュールでは非同期となるため、コールバック関数なしで同期ができるsrnc-requestモジュールを紹介した。

同期処理でrequestモジュールの戻り値を返す(Node.js)(非コールバック) - designetwork

Node.jsソースコード

ソースコードはこちら。ポイントは後述する。

npmの情報

オフィシャルにJSONをポストするためのコマンド構文は記載されている。今回はPOSTする情報を変数で作っている。

var request = require('sync-request');
var res = request('POST', 'https://example.com/create-user', {
  json: { username: 'ForbesLindesay' }
});
var user = JSON.parse(res.getBody('utf8'));

Optionsの部分で使える項目は規定されている。今回はHeaderに"Content-type: application/json"を追加するのではなく、既に規定されているjsonを使用した。

  • json - sets body but to JSON representation of value and adds Content-type: application/json.

Redmine APIJSONをPOSTしてチケット作成する

Redmine APIのPOSTについてはこちらを参考にさせていただきました。ありがとうございます。

RedmineのAPIでチケットを操作してみた。 – けんさんのIT知識

ソースコードを解説する。

ポイントとしてチケット登録時のJSONはGET時と構文が異なる。各種項目を"\<index>_id"で指定する必要がある。

function redminePost(){
  bodyJson = {
    "issue":{
      "project_id":13,
      // NG!! "project":{"id":13,"name":"Webシステム"},
      "tracker_id":1,
      "status_id":1,
      <snip>

POST部分はこちら。jsonにContent-typeは入っているのでHeaderは必要ない。

  var response = request(
    'POST',
    'http://'+ticketUrl+'/issues.json?key='+ticketKey,{
    // no need //headers: headerJson,
    json: bodyJson
    });

実行結果

上記ソースコードを実行すると、以下の通り結果が返ってくる。

レスポンスコードは201で、header・bodyには各種情報と作成したチケット情報が含まれている。

Start

Response {
  statusCode: 201,
  headers: 
   { date: 'Sat, 19 Nov 2016 07:15:20 GMT',
     server: 'Apache/2.4.6 (CentOS) PHP/5.4.16 Phusion_Passenger/5.0.21',
     'cache-control': 'max-age=0, private, must-revalidate',
     'x-frame-options': 'SAMEORIGIN',
     'x-xss-protection': '1; mode=block',
     'x-content-type-options': 'nosniff',
     'x-request-id': '1c51e2d8-9f5e-44c2-b107-884a04a06d21',
     location: 'http://<Redmine URL>/issues/<チケット番号>',
     etag: 'W/"39d9d5ced85e556ab368c6065c935908"',
     'content-length': '508',
     status: '201 Created',
     connection: 'close',
     'content-type': 'application/json; charset=utf-8' },
  body: <Buffer 7b 22 69 73 73 75 65 22 3a 7b 22 69 64 22 3a 31 31 36 2c 22 70 72 6f 6a 65 63 74 22 3a 7b 22 69 64 22 3a 31 33 2c 22 6e 61 6d 65 22 3a 22 57 65 62 e3 ... >,
  url: undefined }
 body
{ issue: 
   { id: 116,
     project: { id: 13, name: 'Webシステム' },
     tracker: { id: 3, name: 'サポート' },
     status: { id: 1, name: '新規' },
     priority: { id: 2, name: '通常' },
     author: { id: 5, name: '<POSTしたユーザ>' },
     subject: 'Node.jsでJSONをPOSTできない',
     description: '',
     start_date: '2016-11-19',
     done_ratio: 0,
     custom_fields: [ [Object], [Object] ],
     created_on: '2016-11-19T07:15:20Z',
     updated_on: '2016-11-19T07:15:20Z' } }

End

まとめ

sync-requestで同期処理でPOSTすることができた。コールバック関数などを使用せず、シンプルにNode.js(JavaScript)で順序性のある処理をすることができる。