Biz/Browser と Wagby を REST API で連携する

最終更新日: 2020年6月9日

Biz/Browserとは

Biz/Browserとは業務アプリケーション専用画面のためのプラットフォームです。Biz/Browserを使って業務画面を設計し、Wagby と連携させることができます。

ここではWagbyが自動生成する画面に代わって Biz/Browser で開発した UI を使う方法を説明します。

実行例

Biz/Browser と Wagby の連携イメージを示します。図1 は Biz/Browser で開発したログオン画面です。

図1 ログオン画面

図2 は Biz/Browser で開発した業務画面です。Wagby の標準画面とは異なるレイアウト、色調となっていることがわかります。

図2 アプリケーション画面

コード

Biz/Browser と Wagby の連携では、Biz/Browser で開発した画面から、REST API を使って Wagby を呼び出すようにします。

図3 開発画面(Biz/Designer)

今回のサンプルアプリケーションで用意したファイルは次のとおりです。拡張子 crs は、Biz/Browser が読み込んで実行するスクリプトとなっています。

図4 ファイル一覧

REST API による通信処理 - ログオン

ポイントとなるのは、REST API による通信処理です。G_HTTP_WAGBY.crs のコードを抜粋して紹介します。最初にログオン処理のコードを示します。

import "G_SETTING.crs";
import "G_MSG.crs";
import "G_UTIL.crs";
Record G_HTTP_WAGBY {
    Function getSession(){
        return findHTTPSession( G_SETTING.APP_HOST_WAGBY.Value );
    }
    /**
     * ログオン
     * @param user
     * @param pass
     * @return なし
     * @throws 
     * @version 1.0
     */
    Function logon( user, pass ){
        /* httpSessionオブジェクトを検索 */
        var session = getSession();
        /* 新しいリクエストを作成 */
        var req = session.createRequest("/wagby/rest/session", HttpSession.UTF8_ENCODE);
        req.SetHeader( "Content-Type", "application/x-www-form-urlencoded" );
        req.addParam( "user", user );
        req.addParam( "pass", pass );
        /* レスポンス格納変数 */
        var res;
        var cookie;
        var jsondoc = new JSONDocument();
        var res_arr = new Array();
        try {
            /* リクエスト送信・レスポンス取得処理 */
            res = session.Put(req);
            /* HTTP ステータスエラー判別処理 */
            /* 401=ログオン失敗 */
            if( res.status == $HTTP_UNAUTHORIZED ){
                jsondoc.Parse( TextConverter.Convert( res.body, "UTF-8", "Shift_JIS" ) );
                res_arr["code"] = jsondoc.Value["errors"]["jfcerror"][0]["code"];
                res_arr["content"] = jsondoc.Value["errors"]["jfcerror"][0]["content"];
                res_arr["name"] = jsondoc.Value["errors"]["jfcerror"][0]["name"];
                res_arr["result"] = $False;
                return res_arr;
            } else if (res.status != $HTTP_OK) {
                throw new Exception("HTTP_ERROR", 1, res.status);
            }
            print( TextConverter.Convert( res, "UTF-8", "Shift_JIS" ) );
            jsondoc.Parse( TextConverter.Convert( res.body, "UTF-8", "Shift_JIS" ) );
            G_SETTING.r_user.userId.Value = jsondoc.Value["username"];
            res_arr["result"] = $True;
            /* JSESSIONIDを取得する */
            cookie = session.GetCookie();
            for (var i in cookie) {
                print("id=", cookie[i].cookieId, "\n");
                print("value=", cookie[i].cookieValue, "\n");
                if( cookie[i].cookieId == "JSESSIONID" ){
                    G_SETTING.JSESSIONID.Value = cookie[i].cookieValue;
                    break;
                }
            }
        } catch( ex ) {
            //.MessageBox( ex.message );
        }
        /* G_UTIL.showArray(jsondoc.Value); */
        /* G_UTIL.showArray(res_arr); */
        return res_arr;
    }
...
  • 24行目で、Wagbyとのセッションを用意しています。文字コードは utf-8 を指定します。
  • 26行目で、Content-Type に application/x-www-form-urlencoded を指定しています。
  • 28行目と29行目でログオンIDとパスワードをセットしています。
  • 39行目でログオン処理を実行しています。
  • Wagby の REST API は、処理結果が JSON 形式で返します。Biz/Browser では JSONDocument オブジェクトとしてこれを受け取ることができます。文字コードも Shift_JIS に変換しています。
  • 61行目で、クッキーの処理を行い、JSESSIONID を取得しています。これがセッションIDになります。

REST API による通信処理 - ログオフ

同様に、ログオフのコードを示します。

    /**
     * ログオフ
     * @return なし
     * @throws 
     * @version 1.0
     */
    Function logoff(){
        /* httpSessionオブジェクトを検索 */
        var session = getSession();
        /* 新しいリクエストを作成 */
        var req = session.createRequest("/wagby/rest/session", HttpSession.UTF8_ENCODE);
        req.SetHeader( "Content-Type", "application/x-www-form-urlencoded" );
        req.SetHeader( "JSESSIONID", G_SETTING.JSESSIONID.Value );
        /* レスポンス格納変数 */
        var res;
        try {
            /* リクエスト送信・レスポンス取得処理 */
            res = session.Dele(req);
            /* HTTP ステータスエラー判別処理 */
            if (res.status != $HTTP_OK) {
                throw new Exception("HTTP_ERROR", 1, res.status);
            }
        } catch( ex ) {
            //.MessageBox( ex.message );
            return $False;
        }
        print( TextConverter.Convert( res, "UTF-8", "Shift_JIS" ) );
        return $True;
    }
  • Wagby の REST API 仕様であるログオフを呼び出しています。
  • 15行目で、JSESSIONID をセットしています。REST API では常に(ログオン時に取得した)JSESSIONID を渡す必要があります。
  • 22行目で REST API 呼び出しを行っています。

REST API による通信処理 - ログオンユーザの情報取得

ログオンユーザの情報を取得するコードを示します。

    /**
     * ログオンユーザの情報取得
     * @return なし
     * @throws 
     * @version 1.0
     */
    Function getLogonUser(){
        /* httpSessionオブジェクトを検索 */
        var session = getSession();
        /* 新しいリクエストを作成 */
        var req = session.createRequest("/wagby/rest/session", HttpSession.UTF8_ENCODE);
        req.SetHeader( "Content-Type", "application/x-www-form-urlencoded" );
        req.SetHeader( "JSESSIONID", G_SETTING.JSESSIONID.Value );
        /* レスポンス格納変数 */
        var res;
        var cookie;
        var jsondoc = new JSONDocument();
        var res_arr = new Array();
        try {
            /* リクエスト送信・レスポンス取得処理 */
            res = session.Get(req);
            /* HTTP ステータスエラー判別処理 */
            /* 401=未認証時 */
            if( res.status == $HTTP_UNAUTHORIZED ){
                res_arr["result"] = $False;
                return res_arr;
            } else if (res.status != $HTTP_OK) {
                throw new Exception("HTTP_ERROR", 1, res.status);
            }
            print( TextConverter.Convert( res, "UTF-8", "Shift_JIS" ) );
            jsondoc.Parse( TextConverter.Convert( res.body, "UTF-8", "Shift_JIS" ) );
            G_SETTING.r_user.userId.Value = jsondoc.Value["username"];
            /* JSESSIONIDを取得する */
            cookie = session.GetCookie();
            for (var i in cookie) {
                print("id=", cookie[i].cookieId, "\n");
                print("value=", cookie[i].cookieValue, "\n");
                if( cookie[i].cookieId == "JSESSIONID" ){
                    G_SETTING.JSESSIONID.Value = cookie[i].cookieValue;
                    break;
                }
            }
        } catch( ex ) {
            //.MessageBox( ex.message );
        }
        /* G_UTIL.showArray(jsondoc.Value); */
        /* G_UTIL.showArray(res_arr); */
        return res_arr;
    }
  • 38 行目で、jsondoc.Value を使って戻り値の JSON オブジェクトから値を取得しています。

REST API による通信処理 - 一覧表示データを取得

モデルIDを引数に渡すと、そのモデルの一覧表示データを取得するコードを紹介します。

    /**
     * 一覧表示データを取得
     * @param modelId
     * @param mode 
     * @return なし
     * @throws 
     * @version 1.0
     */
    Function getList( modelId, param ){
        /* httpSessionオブジェクトを検索 */
        var session = getSession();
        /* 新しいリクエストを作成 */
        var req;
        if( param instanceof Array ){
            req = session.createRequest("/wagby/rest/" + modelId + "/list", HttpSession.UTF8_ENCODE);
            req.SetHeader( "Content-Type", "application/x-www-form-urlencoded" );
            for( var i in param ){
                req.AddParam( i , param[i] );
            }
        }else{
            switch( param ){
                case "first":   /* 最初のページの検索結果を取得 */
                case "last":    /* 最後のページの検索結果を取得 */
                case "next":    /* 次ページの検索結果を取得 */
                case "prev":    /* 前ページの検索結果を取得 */
                    req = session.createRequest("/wagby/rest/" + modelId + "/list/" + param, HttpSession.UTF8_ENCODE);
                    break;
                case "jump":    /* ページ番号を指定した検索結果を取得 */
                    req = session.createRequest("/wagby/rest/" + modelId + "/list/" + param + "/last", HttpSession.UTF8_ENCODE);
                    break;
                default:
                    req = session.createRequest("/wagby/rest/" + modelId + "/list", HttpSession.UTF8_ENCODE);
                    break;
            }
        }
        req.SetHeader( "JSESSIONID", G_SETTING.JSESSIONID.Value );
        /* レスポンス格納変数 */
        var res;
        var cookie;
        var jsondoc = new JSONDocument();
        var res_arr = new Array();
        try {
            /* リクエスト送信・レスポンス取得処理 */
            if( param instanceof Array ){
                res = session.Post(req);
            }else{
                res = session.Get(req);
            }
            /* HTTP ステータスエラー判別処理 */
            if (res.status != $HTTP_OK) {
                throw new Exception("HTTP_ERROR", 1, res.status);
            }
            print( TextConverter.Convert( res, "UTF-8", "Shift_JIS" ) );
            jsondoc.Parse( TextConverter.Convert( res.body, "UTF-8", "Shift_JIS" ) );
            res_arr["size"] = jsondoc.Value["result"]["size"];
            res_arr["next"] = jsondoc.Value["result"]["next"];
            res_arr["current"] = jsondoc.Value["result"]["current"];
            res_arr["nextPage"] = jsondoc.Value["result"]["nextPage"];
            res_arr["prevPage"] = jsondoc.Value["result"]["prevPage"];
            res_arr["entity"] = jsondoc.Value["entity"];
            res_arr["list"] = jsondoc.Value["listp"]["item_"];
        } catch( ex ) {
            //.MessageBox( ex.message );
        }
        /* G_UTIL.showArray(jsondoc.Value); */
        /* G_UTIL.showArray(res_arr); */
        return res_arr;
    }
  • Wagby の REST API 仕様では、"/wagby/rest/モデルID/list" で一覧表示データを取得できます。
  • getList の第二引数 param が配列の場合、そのまま Wagby のパラメータとしています。単一文字列の場合、コメンドとして扱っています。
  • 戻り値の JSON オブジェクトに含まれる entity や list を、res_arr にそれぞれセットしています。この値を使って画面描画を行うことになります。(画面描画を行う crs ファイルの説明は割愛します。Biz/Browser のマニュアルをお読みください。)

REST API による通信処理 - 新規登録

モデルIDを引数に渡すと、そのモデルの新規登録処理を行うコードを紹介します。

    Function insert( modelId, param ){
        var rtnarr = new Array();
        /* httpSessionオブジェクトを検索 */
        var session = getSession();
        /* 新しいリクエストを作成 */
        var req = session.createRequest("/wagby/rest/" + modelId + "/new", HttpSession.UTF8_ENCODE);
        req.SetHeader( "Content-Type", "application/x-www-form-urlencoded" );
        req.SetHeader( "JSESSIONID", G_SETTING.JSESSIONID.Value );
        for( var i in param ){
            req.AddParam( i , param[i] );
        }
        /* レスポンス格納変数 */
        var res;
        var cookie;
        var jsondoc = new JSONDocument();
        var res_arr = new Array();
        try {
            /* リクエスト送信・レスポンス取得処理 */
            res = session.Post(req);
            print( TextConverter.Convert( res, "UTF-8", "Shift_JIS" ) );
            jsondoc.Parse( TextConverter.Convert( res.body, "UTF-8", "Shift_JIS" ) );
            /* HTTP ステータスエラー判別処理 */
            if (res.status != $HTTP_OK) {
                rtnarr["name"] = jsondoc.Value["errors"]["jfcerror"][0]["name"];
                rtnarr["content"] = jsondoc.Value["errors"]["jfcerror"][0]["content"];
                rtnarr["code"] = jsondoc.Value["errors"]["jfcerror"][0]["code"];
                rtnarr["result"] = $False;
            }else{
                rtnarr["name"] = jsondoc.Value["errors"]["jfcinfo"][0]["name"];
                rtnarr["content"] = jsondoc.Value["errors"]["jfcinfo"][0]["content"];
                rtnarr["code"] = jsondoc.Value["errors"]["jfcinfo"][0]["code"];
                rtnarr["entity"] = jsondoc.Value["entity"];
                rtnarr["result"] = $True;
            }        
        } catch( ex ) {
            //.MessageBox( ex.message );
        }
        return rtnarr;
    }
  • Wagby の REST API 仕様では、"/wagby/rest/モデルID/new" でデータを登録できます。
  • 第二引数 param には、REST API が受けとることのできる形式でデータが渡されているものとします。

REST API による通信処理 - 更新

モデルIDを引数に渡すと、そのモデルの更新処理を行うコードを紹介します。

    Function update( modelId, param, key ){
        var rtnarr = new Array();
        /* httpSessionオブジェクトを検索 */
        var session = getSession();
        if( key == null ){
            key = "";
        }else if( key != "" ){
            key = "/" + str( key );
        }
        /* 新しいリクエストを作成 */
        var req = session.createRequest("/wagby/rest/" + modelId + "/edit" + key, HttpSession.UTF8_ENCODE);
        req.SetHeader( "Content-Type", "application/x-www-form-urlencoded" );
        req.SetHeader( "JSESSIONID", G_SETTING.JSESSIONID.Value );
        for( var i in param ){
            req.AddParam( i , param[i] );
        }
        /* レスポンス格納変数 */
        var res;
        var cookie;
        var jsondoc = new JSONDocument();
        var res_arr = new Array();
        try {
            /* リクエスト送信・レスポンス取得処理 */
            res = session.Put(req);
            print( TextConverter.Convert( res, "UTF-8", "Shift_JIS" ) );
            jsondoc.Parse( TextConverter.Convert( res.body, "UTF-8", "Shift_JIS" ) );
            /* HTTP ステータスエラー判別処理 */
            if (res.status != $HTTP_OK) {
                rtnarr["name"] = jsondoc.Value["errors"]["jfcerror"][0]["name"];
                rtnarr["content"] = jsondoc.Value["errors"]["jfcerror"][0]["content"];
                rtnarr["code"] = jsondoc.Value["errors"]["jfcerror"][0]["code"];
                rtnarr["result"] = $False;
            }else{
                rtnarr["name"] = jsondoc.Value["errors"]["jfcinfo"][0]["name"];
                rtnarr["content"] = jsondoc.Value["errors"]["jfcinfo"][0]["content"];
                rtnarr["code"] = jsondoc.Value["errors"]["jfcinfo"][0]["code"];
                rtnarr["entity"] = jsondoc.Value["entity"];
                rtnarr["result"] = $True;
            }            
        } catch( ex ) {
            //.MessageBox( ex.message );
        }
        return rtnarr;
    }
  • Wagby の REST API 仕様では、"/wagby/rest/モデルID/edit/主キー" でデータを更新できます。主キーが必要です。
  • 第二引数 param には、REST API が受けとることのできる形式でデータが渡されているものとします。
  • 第三引数 key には、主キーが渡されています。

問い合わせ先

ここで紹介したサンプルアプリケーションおよびコード一式は、株式会社ソフトウェア・パートナー様がご用意したものです。

Biz/Browser と Wagby の連携についてのデモンストレーションおよび詳細は、同社へお問い合わせください。