はじめに
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);
})
};