外部システムから IM-Notice に通知を送る方法

この CookBook では、intra-mart Accel Platform 8.0.14 2016 Summer から導入された IM-Notice への通知タスクを利用して、外部システムから IM-Notice へ通知する方法について紹介します。

完成サンプル

以下の完成サンプルをダウンロードしてご活用ください。

LogicDesigner フロー、ルーティング定義 : im_cookbook_119839_im_logicdesigner-data.zip

レシピ

  1. LogicDesigner から通知タスクを利用して通知を行うフローを作成します。
  2. 作成したフローを用いてルーティング定義を作成します。
  3. 外部システムから作成したルーティングに対して API を呼び出し、通知を行います。

1. LogicDesigner から通知タスクを利用して通知を行うフローを作成します。

  1. サイトマップから「Flow Definition List」を開きます。
  2. 「Create new」をクリックします。
  3. 「Desktop Notification Task」と「Mobile Notification Task」を配置します。
  4. 配置した「Desktop Notification Task」タスクをクリックし、「Continue Process even on Error」と「Save Notification History」をチェックします。こうする事で、デスクトップ通知が失敗した場合でも後続のモバイル通知を行えるようにし、通知履歴にもデータを保存する事ができるようになります。
  5. 「Input and Output Settings」をクリックし、下図のように入力パラメータを設定します。
  6. 配置した「Desktop Notification Task」タスクをダブルクリックし、下図のようにパラメータのマッピングを設定します。デスクトップ通知タスクの入力パラメータについてはこちらを参照してください。
  7. 配置した「Mobile Notification Task」タスクをダブルクリックし、下図のようにパラメータのマッピングを設定します。モバイル通知タスクの入力パラメータについてはこちらを参照してください。
  8. 「Save Newly」をクリックします。
  9. 下図のように入力し「OK」をクリックします。

2. 作成したフローを用いてルーティング定義を作成します。

  1. サイトマップから「Routing Definition List」を開きます。
  2. 「Create new」をクリックします。
  3. 下図のように入力し「Register」をクリックします。この CookBook では POST でリクエストを受け付け、かつ Basic 認証がかかるルーティングとして作成します。
  4. 「cookbook119839」の「Authorization」をクリックします。
  5. 「Start the authorization setting」をクリック後「Authenticated User」と「POST cookbook119839」をチェックして有効化し、「End the authorization setting」をクリックします。

3. 外部システムから作成したルーティングに対して API を呼び出し、通知を行います。

以下のようにして、外部システムから通知を行う事ができます。

1. curl の場合

以下の curl コマンドを実行します。

curl コマンド
curl -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d @body.json -u aoyagi:aoyagi http://localhost:8080/imart/logic/api/cookbook119839
body.json
{
  "subject": "Title",
  "body": "Body",
  "userCds": [
    "aoyagi"
  ],
  "url": "https://www.example.com"
}
2. C(LibCurl) の場合
CURL* hnd = curl_easy_init();

curl_easy_setopt(hnd, CURLOPT_CUSTOMREQUEST, "POST");
curl_easy_setopt(hnd, CURLOPT_URL, "http://localhost:8080/imart/logic/api/cookbook119839");

struct curl_slist* headers = NULL;

headers = curl_slist_append(headers, "authorization: Basic YW95YWdpOmFveWFnaQ==");
headers = curl_slist_append(headers, "content-type: application/json");
headers = curl_slist_append(headers, "accept: application/json");
curl_easy_setopt(hnd, CURLOPT_HTTPHEADER, headers);

curl_easy_setopt(hnd, CURLOPT_POSTFIELDS, "{\r\n  \"subject\": \"Title\",\r\n  \"body\": \"Body\",\r\n  \"userCds\": [\r\n    \"aoyagi\"\r\n  ],\r\n  \"url\": \"https://www.example.com\"\r\n}");

CURLcode ret = curl_easy_perform(hnd);
3. C#(RestSharp) の場合
var client = new RestClient("http://localhost:8080/imart/logic/api/cookbook119839");
var request = new RestRequest(Method.POST);
request.AddHeader("content-type", "application/json");
request.AddHeader("accept", "application/json");
request.AddParameter("application/json", "{\r\n  \"subject\": \"Title\",\r\n  \"body\": \"Body\",\r\n  \"userCds\": [\r\n    \"aoyagi\"\r\n  ],\r\n  \"url\": \"https://www.example.com\"\r\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
4. Java(OK HTTP) の場合
OkHttpClient client = new OkHttpClient();

MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\r\n  \"subject\": \"Title\",\r\n  \"body\": \"Body\",\r\n  \"userCds\": [\r\n    \"aoyagi\"\r\n  ],\r\n  \"url\": \"https://www.example.com\"\r\n}");
Request request = new Request.Builder()
  .url("http://localhost:8080/imart/logic/api/cookbook119839")
  .post(body)
  .addHeader("accept", "application/json")
  .addHeader("content-type", "application/json")
  .addHeader("authorization", "Basic YW95YWdpOmFveWFnaQ==")
  .build();

Response response = client.newCall(request).execute();
5. JavaScript(jQuery ajax) の場合
var settings = {
  "async": true,
  "crossDomain": true,
  "url": "http://localhost:8080/imart/logic/api/cookbook119839",
  "method": "POST",
  "headers": {
    "accept": "application/json",
    "content-type": "application/json",
    "authorization": "Basic YW95YWdpOmFveWFnaQ=="
  },
  "processData": false,
  "data": "{\r\n  \"subject\": \"Title\",\r\n  \"body\": \"Body\",\r\n  \"userCds\": [\r\n    \"aoyagi\"\r\n  ],\r\n  \"url\": \"https://www.example.com\"\r\n}"
}

$.ajax(settings).done(function (response) {
  console.log(response);
});
6. Node.js の場合
var request = require("request");

var options = {
  method: 'POST',
  url: 'http://localhost:8080/imart/logic/api/cookbook119839',
  headers: {
     authorization: 'Basic YW95YWdpOmFveWFnaQ==',
     'content-type': 'application/json',
     accept: 'application/json'
  },
  body: {
     subject: 'Title',
     body: 'Body',
     userCds: ['aoyagi'],
     url: 'https://www.example.com'
  },
  json: true
};

request(options, function (error, response, body) {
  if (error) {
    throw new Error(error);
  }

  console.log(body);
});
7. Python の場合
import requests

url = "http://localhost:8080/imart/logic/api/cookbook119839"

payload = "{\r\n  \"subject\": \"Title\",\r\n  \"body\": \"Body\",\r\n  \"userCds\": [\r\n    \"aoyagi\"\r\n  ],\r\n  \"url\": \"https://www.example.com\"\r\n}"
headers = {
    'accept': "application/json",
    'content-type': "application/json",
    'authorization': "Basic YW95YWdpOmFveWFnaQ=="
}

response = requests.request("POST", url, data=payload, headers=headers)

print(response.text)
8. Ruby の場合
require 'uri'
require 'net/http'

url = URI("http://localhost:8080/imart/logic/api/cookbook119839")

http = Net::HTTP.new(url.host, url.port)

request = Net::HTTP::Post.new(url)
request["accept"] = 'application/json'
request["content-type"] = 'application/json'
request["authorization"] = 'Basic YW95YWdpOmFveWFnaQ=='
request.body = "{\r\n  \"subject\": \"Title\",\r\n  \"body\": \"Body\",\r\n  \"userCds\": [\r\n    \"aoyagi\"\r\n  ],\r\n  \"url\": \"https://www.example.com\"\r\n}"

response = http.request(request)
puts response.read_body
9. Swift の場合
import Foundation

let headers = [
  "accept": "application/json",
  "content-type": "application/json",
  "authorization": "Basic YW95YWdpOmFveWFnaQ=="
]
let parameters = [
  "subject": "Title",
  "body": "Body",
  "userCds": ["aoyagi"],
  "url": "https://www.example.com"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "http://localhost:8080/imart/logic/api/cookbook119839")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()

このように、LogicDesigner を用いる事で外部から容易に連携することができます。
是非、ご活用ください。