イントロ
独自のカスタマイズやその他の目的でRESTfulAPIとしてBioStar2 New Local APIを使用する場合は、この記事を参照してください。この記事では、C#コンソールアプリケーションによるBioStar 2 New Local APIの基本的な使用法について説明します。
機能
この記事では、以下の機能について説明します。
この記事では、API関数を呼び出して、選択した期間内のログデータを取得する方法を確認します。パラメーター入力時取得するログの数の確認が必要です。
API呼び出し用に作成されたC#プログラムのサンプルコードをご覧ください。ソースコードをコピーして貼り付けて同じ機能を使用できます。
また、RESTfulAPI呼び出しに使用するプログラムであるPostmanを介してAPI関数を呼び出す方法も確認します。
Part 1. API呼び出しとパラメーター
[POST]: /events/search
[パラメーター]
名称 | タイプ | *M/O | 説明 |
… |
|
|
|
limit | integer | O | 取得するログの数 |
Conditions-values | String Array | O | イベント発生期間の設定。終了時刻の値は開始時刻よりも大きくする必要があります。 * ISO-8601形式のUTCでの日時(例 2015-06-10T02:14:05.268Z ) |
Conditions-operator | integer | O | desc: 検索条件[ EQUAL : 0, NOT_EQUAL : 1, CONTAINS : 2, BETWEEN : 3, LIKE : 4, GREATER : 5, LESS : 6] |
* M – 必須, O – オプション
Part 2. リクエストボディとレスポンスモデル
[値/パラメータモデルの例]
{ "Query": { "limit": 100, "conditions": [ { "column": "datetime", "operator": 3, "values": [ "2021-08-01T15:00:00.000Z", "2021-08-02T14:59:59.000Z" ] } ] } } |
*"limit" : 100はAPI呼び出しの結果としてレスポンスに100個のログを表示を示します。大量のデータを取得するとサーバにに過負荷がかかる可能性があります。
*"column" : datetimeは、ログのdatetime値でログを検索することを示します。たとえば、2021-08-01T15:00:00.000Zから2021-08-02T14:59:59.000Zまでのログが表示されます。
*"column" : idまたはその他の値に変更すると、それに応じてログをidまたはその他の値で検索ができます。
[レスポンス:成功]
{ "EventCollection": { "rows": [ { "id": "133", "server_datetime": "2021-08-02T13:08:27.00Z", "datetime": "2021-08-02T04:08:30.00Z", "index": "346", "user_group_id": { "id": "0", "name": "" }, "device_id": { "id": "939271697", "name": "BioStation A2 939271697 (192.168.13.132)" }, "event_type_id": { "code": "20736" }, "door_id": [ { "id": "4", "name": "Door1" } ], "is_dst": "0", "timezone": { "half": "0", "hour": "9", "negative": "0" }, "user_update_by_device": "false", "hint": "162787731009392716970000000346", "user_id": { "photo_exists": "false" } }, . |
*hint: ACデータベースの各テーブル(月次ログ)のインデックス値。テーブルの最初のログデータから開始して、新規ログデータごとに番号が1ずつ増加します。
*「hint」を使用すると、ログの比較が可能になります。できるため、特定のログが一部のログの前後にあることを理解できます。
Part 3. コンソールログ取得の例
[ログの取得メソッドのソースコード]
static async void GetLogTask() { if(sessionID == null) { Console.WriteLine("You must log in first!"); return; }
CookieContainer cookieContainer = new CookieContainer();
HttpClientHandler handler = new HttpClientHandler(); handler.CookieContainer = cookieContainer;
HttpClient httpClient = new HttpClient(handler);
HttpClient client = new HttpClient(handler); httpClient.DefaultRequestHeaders.Add("bs-session-id", sessionID); cookieContainer.Add(new Uri("https://127.0.0.1"), new Cookie("bs-session-id", sessionID)); string resourceAddress = "https://127.0.0.1/api/events/search"; Console.WriteLine("How many results do you want to see?"); string limit = Console.ReadLine(); string startTime = "1970-01-01T00:00:00Z"; string endTime = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
DateTime dtLatestLogTime = new DateTime(1970, 1, 1);
JavaScriptSerializer serializer = new JavaScriptSerializer();
string payload2 = "{ \"Query\": { \"limit\": " + limit + ", \"conditions\": [ { \"column\": \"datetime\", \"operator\": 3, \"values\": [ \"" + startTime + "\", \"" + endTime + "\" ] } ] }}"; Console.WriteLine(payload2);
StringContent sc = new StringContent(payload2, Encoding.UTF8, "application/json"); HttpResponseMessage httpResponse = httpClient.PostAsync(resourceAddress, sc).Result;
if (httpResponse.IsSuccessStatusCode == true) { Console.WriteLine("Succeeded to retrieve log from " + startTime + " to " + endTime); string httpResponseBody = await httpResponse.Content.ReadAsStringAsync(); //Console.WriteLine(httpResponseBody); dynamic obj = JsonConvert.DeserializeObject(httpResponseBody); Console.WriteLine("************** LOG("+limit+") : **************"); Console.WriteLine("** LogID ********* DateTime *********** DeviceID ******************** DeviceName ********************* EventCode *****"); for (int i = 0; i < Int16.Parse(limit); i++) { Console.WriteLine(obj.EventCollection.rows[i].id + " " + obj.EventCollection.rows[i].datetime + " " + obj.EventCollection.rows[i].device_id.id + " " + obj.EventCollection.rows[i].device_id.name + " " + obj.EventCollection.rows[i].event_type_id.code); } System.Threading.Thread.Sleep(1000); } else { Console.WriteLine("Log Retrieval Failed from " + startTime + " to " + endTime); Console.WriteLine(httpResponse.ToString()); }
} |
[ログの取得に成功:ログのいくつかの値のみを表示]
Part 4. Postmanでログ取得
[リクエスト例: ヘッダー]
*他のAPI呼び出しでのAPIの使用を認証するには、LoginAPI呼び出しのレスポンスヘッダーの「be-session-id」値を入力してください。
[リクエスト例 ]
[レスポンス例: body]