Help us understand the problem. What is going on with this article?

OpenMBEE MMSのREST APIを使う

はじめに

OpenMBEEのMMSのREST-APIをJavascriptで使う方法をサンプルコードをベースに記載します。
http://www.openmbee.org/

OpenMBEEやMMSとは何ぞやという人がほとんどかと思いますが、REST-APIをJavascriptで使うサンプルと思っていただければと。

比較的新しいJavascriptでの書き方を目指しており(ES6)、varやfunctionは使わないようにしています。

HTML

HTML部分は以下になります。
<div>の部分にAPIで取得したデータを表示していくだけです。

<html lang="ja">

<h1>Display Debug URL</h1>
<div id="testUrl"></div>

<h1>orgs</h1>
<div id="orgs"></div>
<div id="orgs2"></div>
<div id="orgInput"></div>

<h1>projects</h1>
<div id="projects"></div>

<h1>refs</h1>
<div id="refs"></div>

<h1>documents</h1>
<div id="documents"></div>

<h1>elements</h1>
<div id="elements"></div>

</html>

認証

MMSのREST-APIはBASIC認証(のようなもの?)がかかっているのでHTTPヘッダに加える認証情報を作成します。(Javascriptのコードになります)
MMSに限らず、BASIC認証がかかっているサイトでREST-APIを使う場合はこの方法で行けます(多分)
"admin:admin"の部分がユーザ名とパスワードになります。

    const sServerUrl = "[[サーバURL]]";

    const Base64_encode = (str) => {
        return btoa(unescape(encodeURIComponent(str)));
    };

    const sAuth = Base64_encode("admin:admin");
    console.log(sAuth);

API

GET

Organizationの一覧を取得するAPIです。引数なしのREST-APIです。
dispOrgs関数で取得したJSONを表示しますが、この関数の実装は後のほうに記載してあります。

    /**
     * Get Organization
     */
    const getOrgs = () => {
        const url = `http://${sServerUrl}/alfresco/s/orgs`;
        console.log(url);
        document.getElementById("testUrl").textContent = url;

        const myHeaders = new Headers();
        myHeaders.set("Authorization", `Basic ${sAuth}`);
        console.log(myHeaders.get("Authorization"));

        const req = new Request(url,{
            method : "GET"
            ,headers: myHeaders
            ,mode: "cors"
        });

        fetch(req).then((response) => {
            return response.json();
        }).then((json) => {
            console.log(json);
            console.log(json.orgs);
            console.log(json.orgs.length);
            dispOrgs(json);
        })
    };

projectの一覧を取得するAPIです。

    /**
     * get projects 
     * @param orgId
     */
    const getProjects = (orgId) => {
        const url = `http://${sServerUrl}/alfresco/s/orgs/${orgId}/projects`;
        console.log(url);
        document.getElementById("restUrl").textContent = url;

        const myHeaders = new Headers();
        myHeaders.set("Authorization", `Basic ${sAuth}`);
        console.log(myHeaders.get("Authorization"));

        const req = new Request(url,{
            method : "GET"
            ,headers: myHeaders
            ,mode: "cors"
        });

        fetch(req).then((response) => {
            return response.json();
        }).then((json) => {
            console.log(json);
            dispProjects(json,orgId);
        })
    };

refsを取得するAPIです。(ブランチの一覧が取れるようです)

    /**
     * get refs
     * @param projectId
     */
    const getRefs = (projectId) => {
        const url = `http://${sServerUrl}/alfresco/s/projects/${projectId}/refs`;
        console.log(url);
        document.getElementById("restUrl").textContent = url;

        const myHeaders = new Headers();
        myHeaders.set("Authorization", `Basic ${sAuth}`);
        console.log(myHeaders.get("Authorization"));

        const req = new Request(url,{
            method : "GET"
            ,headers: myHeaders
            ,mode: "cors"
        });

        fetch(req).then((response) => {
            return response.json();
        }).then((json) => {
            console.log(json);
            //document.getElementById("refs").textContent = JSON.stringify(json);
            dispRefs(json);
        })
    };

documentの一覧を取得するAPIです

    /**
     * get documents
     * @param projectId
     */
    const getDocuments = (projectId,refId) => {
        const url = `http://${sServerUrl}/alfresco/s/projects/${projectId}/refs/${refId}/documents`;
        console.log(url);
        document.getElementById("restUrl").textContent = url;

        const myHeaders = new Headers();
        myHeaders.set("Authorization", `Basic ${sAuth}`);
        console.log(myHeaders.get("Authorization"));

        const req = new Request(url,{
            method : "GET"
            ,headers: myHeaders
            ,mode: "cors"
        });

        fetch(req).then((response) => {
            return response.json();
        }).then((json) => {
            console.log("DocumentJson");
            console.log(json);
            //document.getElementById("documents").textContent = JSON.stringify(json);
            dispDocuments(json);
        })
    };

artifactの一覧を取得するAPIです。

    /**
     * get artifacts
     * @param projectId
     * @param refId
     */
    const getArtifacts = (projectId,refId) => {
        const url = `http://${sServerUrl}/alfresco/s/projects/${projectId}/refs/{refId}/artifacts`;
        console.log(url);
        document.getElementById("restUrl").textContent = url;

        const myHeaders = new Headers();
        myHeaders.set("Authorization", `Basic ${sAuth}`);
        console.log(myHeaders.get("Authorization"));

        const req = new Request(url,{
            method : "GET"
            ,headers: myHeaders
            ,mode: "cors"
        });

        fetch(req).then((response) => {
            return response.json();
        }).then((json) => {
            console.log("ArtifactJson");
            console.log(json);
        })

    };

elementの一覧を取得するAPIです。

    /**
     * get elements
     * @param projectId
     * @param refId
     */
    const getElements = (projectId,refId) => {
        const url = `http://${sServerUrl}/alfresco/s/projects/${projectId}/refs/${refId}/elements`;
        console.log(url);
        document.getElementById("restUrl").textContent = url;

        const myHeaders = new Headers();
        myHeaders.set("Authorization", `Basic ${sAuth}`);
        console.log(myHeaders.get("Authorization"));

        const req = new Request(url,{
            method : "GET"
            ,headers: myHeaders
            ,mode: "cors"
        });

        fetch(req).then((response) => {
            return response.json();
        }).then((json) => {
            console.log("ElementJson");
            console.log(json);
            dispElements(json);
        })

    };
    /**
     * get ids of elements based on view relationship
     * @param projectId
     * @param refId
     * @param elementId
     */
    const getCfids = (projectId,refId,elementId) => {
        const url = `http://${sServerUrl}/alfresco/s/projects/${projectId}/refs/${refId}/elements/${elementId}/cfids`;
        console.log(url);
        document.getElementById("restUrl").textContent = url;

        const myHeaders = new Headers();
        myHeaders.set("Authorization", `Basic ${sAuth}`);
        console.log(myHeaders.get("Authorization"));

        const req = new Request(url,{
            method : "GET"
            ,headers: myHeaders
            ,mode: "cors"
        });

        fetch(req).then((response) => {
            return response.json();
        }).then((json) => {
            console.log("CfidsJson");
            console.log(json);
            dispCfids(json);
        })

    };

DISP

DISPの項ではAPIの説明ではなく、APIでGetしたものをブラウザに表示するための関数を記載します。
orgとprojectは1対nの関係になっているため、dispOrgsではorgの一覧を表示しますが、クリックするとorgを引数にしてgetProjectを呼び出すようにしています。慣れていないのでfunctionを使わずアロー関数でこれを行うことに苦労しました。

    /**
     * disp org
     */
    const dispOrgs = (orgJson) => {
        let sOrgRow = "";
        let arrOrgId = [];
        for (const oOrg of orgJson.orgs) {
            sOrgRow = `${sOrgRow}<tr><td><a href="javascript:void(0);" id="orgId_${oOrg.id}">${oOrg.id}</a></td><td>${oOrg.name}</td></tr>`;
            arrOrgId.push(oOrg.id);
        }
        const sHtml = `<table>${sOrgRow}</table>`;
        document.getElementById("orgs").innerHTML = sHtml;

        //const sHtml2 = `<input type="text" id="org"></input><input type="button" value="getProjects" onclick="";></input>`;
        //document.getElementById("orgInput").innerHTML = sHtml2;

        for(const sOrdId of arrOrgId){
            const sId = `orgId_${sOrdId}`;
            document.getElementById(sId).onclick = () => {
                console.log(sOrdId);
                getProjects(sOrdId);
            };

        }
    };

    /**
     * disp projects
     */
    const dispProjects = (prjJson,orgId) => {
        document.getElementById("prj_orgId").innerHTML = `orgId= ${orgId}`;

        let sRow = "";
        let arrPrgId = [];
        for (const oPrj of prjJson.projects) {
            sRow = `${sRow}<tr><td><a href="javascript:void(0);" id="prjId_${oPrj.id}">${oPrj.id}</a></td><td>${oPrj.name}</td></tr>`;
            arrPrgId.push(oPrj.id);
        }
        const sHtml = `<table>${sRow}</table>`;
        document.getElementById("projects").innerHTML = sHtml;

        for(const sPrjId of arrPrgId){
            const sId = `prjId_${sPrjId}`;
            document.getElementById(sId).onclick = () => {
                console.log(sPrjId);
                getRefs(sPrjId);
                gProjectId = sPrjId;
            };
        }
    };
    /**
     * disp Refs
     */
     const dispRefs = (refJson) => {
        document.getElementById("ref_projectId").innerHTML = `ProjectId= ${gProjectId}`;

        let sRow = "";
        let arrRefId = [];
        for (const oRef of refJson.refs) {
            sRow = `${sRow}<tr class="table1">`;
            sRow = `${sRow}<td class="table1"><a href="javascript:void(0);" id="refId_doc_${oRef.id}">d</a></td>`;
            sRow = `${sRow}<td class="table1"><a href="javascript:void(0);" id="refId_art_${oRef.id}">a</a></td>`;
            sRow = `${sRow}<td class="table1"><a href="javascript:void(0);" id="refId_${oRef.id}">${oRef.id}</a></td>`;
            sRow = `${sRow}<td>${oRef.name}</td>`;
            sRow = `${sRow}</tr>`;
            arrRefId.push(oRef.id);
        }
        const sHtml = `<table class="table1">${sRow}</table>`;
        document.getElementById("refs").innerHTML = sHtml;

        for(const sRefId of arrRefId){
            const sId = `refId_${sRefId}`;
            document.getElementById(sId).onclick = () => {
                console.log(sRefId);
                getElements(gProjectId,sRefId);
                gRefsId = sRefId;
            };
        }
    };
    /**
     * disp Documents
     */
     const dispDocuments = (docJson) => {
        let sRow = "";
        for (const oDoc of docJson.documents) {
            sRow = `${sRow}<tr><td><a href="javascript:document.getElementById('org').value='${oDoc.id}';void(0);">${oDoc.id}</a></td><td>${oDoc.name}</td></tr>`;
        }
        const sHtml = `<table>${sRow}</table>`;
        document.getElementById("documents").innerHTML = sHtml;
     };
    /**
     * disp Elements
     */
    const dispElements = (elemJson) => {
        let arrElemId = [];

        let sRow = "<tr><th>id</th><th>name</th><th>type</th><th>ownerId</th><th>value type</th><th>value name</th><th>value</th></tr>";
        for (const oElem of elemJson.elements) {
            sRow = `${sRow}<tr class="table1"><td class="table1"><a href="javascript:void(0);" id="elemId_${oElem.id}">${oElem.id}</a></td><td>${oElem.name}</td>`;
            sRow = `${sRow}<td class="table1">${oElem.type}</td><td class="table1">${oElem.ownerId}</td>`;
            if(typeof oElem.value !== 'undefined'){
                let oElementValueType = "";
                let oElementValueName = "";
                let oElementValue = "";
                for (const oValue of oElem.value) {
                    oElementValueType = `${oElementValueType}<div>${oValue.type}</div>`;
                    oElementValueName = `${oElementValueName}<div>${oValue.name}</div>`;
                    oElementValue = `${oElementValue}<div>${oValue.value}</div>`;
                }
                sRow = `${sRow}<td class="table1">${oElementValueType}</td><td class="table1">${oElementValueName}</td><td class="table1">${oElementValue}</td><tr>`;
            }else{
                sRow = `${sRow}<td class="table1">Undef Value</td><td class="table1"></td><td class="table1"></td><tr>`;
            }
            arrElemId.push(oElem.id);
        }
        const sHtml = `<table class="table1">${sRow}</table>`;
        document.getElementById("elements").innerHTML = sHtml;

        for(const sElemId of arrElemId){
            const sId = `elemId_${sElemId}`;
            document.getElementById(sId).onclick = () => {
                console.log(sElemId);
                getCfids(gProjectId,gRefsId,sElemId);
            };
        }

     };

    /**
     * disp cfids
     */
    const dispCfids = (cfidsJson) => {

        let sRow = "";
        for (const oCfids of cfidsJson.elementIds) {
            sRow = `${sRow}<tr><td><a href="javascript:void(0);">${oCfids}</a></td></tr>`;
        }
        const sHtml = `<table>${sRow}</table>`;

        document.getElementById("cfids").innerHTML = sHtml;
    };

POST

POSTのAPIは・・・あまり調べていません。OrgとProjectの登録の2つです。
jsonを送るとjsonの内容に沿って登録されます。
ここで記載するコードは、登録するjsonがコード内にべた書きです。

    /**
     * Post Organizations 
     */
    const postOrgs = () => {
        const url = `http://${sServerUrl}/alfresco/s/orgs`;
        console.log(url);
        document.getElementById("restUrl").textContent = url;

        const oJson = {"orgs": [{"id": "vetest", "name": "vetest"},{"id": "vetest2", "name": "vetest2"}]};

        const oBody = JSON.stringify(oJson);
        const myHeaders = new Headers();
        myHeaders.set("Authorization", `Basic ${sAuth}`);
        myHeaders.set("Content-Type", "application/json");

        //console.log(myHeaders.get("Authorization"));
        console.log("POST JSON");
        console.log(oJson);
        console.log(oBody);
        const req = new Request(url,{
            method : "POST"
            ,headers: myHeaders
            ,mode: "cors"
            ,body : oBody
        });

        fetch(req).then((response) => {
            return response.json();
        }).then((json) => {
            console.log(json);
        })
    };

    /**
     * Post Projects
     * @param orgId
     */
    const postProjects = (orgId) => {
        const url = `http://${sServerUrl}/alfresco/s/orgs/${orgId}/projects`;
        console.log(url);
        document.getElementById("restUrl").textContent = url;

        const oJson = {"projects": [{"type":"Project","id": "vetestPrj", "name": "vetestPrj"},{"type":"Project","id": "vetestPrj2", "name": "vetestPrj2"}]};

        const oBody = JSON.stringify(oJson);
        const myHeaders = new Headers();
        myHeaders.set("Authorization", `Basic ${sAuth}`);
        myHeaders.set("Content-Type", "application/json");

        //console.log(myHeaders.get("Authorization"));
        console.log("POST JSON");
        console.log(oJson);
        console.log(oBody);
        const req = new Request(url,{
            method : "POST"
            ,headers: myHeaders
            ,mode: "cors"
            ,body : oBody
        });

        fetch(req).then((response) => {
            return response.json();
        }).then((json) => {
            console.log(json);
        })
    };
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした