MCS + JET学习笔记
如下图,一个Custom API可以属于多个MBE, 一个Custom API可以调用多个Connector.
这样可以松耦合,可以复用。把通用的安全设置放在MBE, MBE相当于一个入口。
MCS通过Connector与后端集成,定义安全策略等。Connector一般只定义BASE URL,后面的参数在CUSTOMER API中通过定义资源区分,这样可以大大减少Connector的数量。Connector可以复用。
比如后端一个REST服务的URL是:https://apex.oracle.com/pls/apex/xh/mcsMock/listView
可以定义Connector的Remote URL是https://apex.oracle.com/pls/apex/xh/mcsMock
当然直接定义为https://apex.oracle.com/pls/apex/xh/mcsMock/listView也可以,但CUSTOM API调用的时候RESOURCE部分写成空。
在Custom API中要定义资源resource, 如上面的Connector,定义一个view的resource.
在下载的ZIP文件中:
需要把Custom api 要调用的Connector配置到package.json中:
"connectors" :{"/mobile/connector/xcjlistview": "1.0" }
service.post('/mobile/custom/listviewAPI/view',function(req,res) {
console.log("requestquery viewid:" + req.query.viewid );
req.oracleMobile.connectors.xcjlistview.get("listView",null, null).then(
function(result){
res.send(result.statusCode,result.result);
},
function(error){
res.send(500,error.error);
}
);
});
如果在Connector xcjlistview 中配置的RemoteURL 是:
https://apex.oracle.com/pls/apex/xh/mcsMock/listView
上面的代码要改成:req.oracleMobile.connectors.xcjlistview.get("",null, null).then
先在Custom API的Resource中配置参数
然后在Custom API的实现代码中通过req.query.参数名获取,见上面的例子。
console.log("request queryviewid:" + req.query.viewid );
Remote REST service:
http://638ff160-ab38-4a99-9733-495d65f1018e.tunnel.whsz100.com/app/activity/activitylist
定义一个Connector: 但该Connector中的REMOTE URL是
http://638ff160-ab38-4a99-9733-495d65f1018e.tunnel.whsz100.com/app
这样如果有多个调用,可以配置成多个RESOURCE,对应不同的END POINT
定义好之后,可以测试,注意填写了:Local URI 中要加上:activity/activitylist
这样REMOTE URL 为:
http://638ff160-ab38-4a99-9733-495d65f1018e.tunnel.whsz100.com/app/activity/activitylist
根据该CONNECTOR 定义一个CUSTOM API
该CUSTOMER API 是个REST,
Base url 如下:
https://apacdemo2-apacmobile2.mobileenv.us2.oraclecloud.com:443/mobile/custom/HNACustomAPIs
定义一个 endpoint: Activity
该CUSTOMER api 的IMPLEMENTATION 是node.js 代码。需要在本地写好,然后上传
在node.js 代码中通过如下方式调用
需要在PACKAGE.JSON中把该CONNECTOR配置进去:类似下面这样
"oracleMobile" : {
"dependencies" : {
"apis" : { },
"connectors" :{"/mobile/custom/HNACustomAPIs ": "1.0" }
}
}
如果在JET中调用,还需要把该API加入到BACKEND中去
红色字是说明外部调用/mobile/custom/HNACustomAPIs/Activity的时候执行callHNA()这个函数
service.post('/mobile/custom/HNACustomAPIs/Activity',function(req, res) {
callHNA(req,res);
});
varcallHNA = function(req, res) {
varsdk = req.oracleMobile;
varbody = req.body;
console.log("chunjin#######HNA Activity request:" + JSON.stringify(body));
try{
varjsonStr = body.query;
console.log("chunjin#######HNA Activity post:" + jsonStr);
// HNAConnector是CONNECTOR的名字
///activity/activitylist 是RESOURCE
//采用POST方式
sdk.connectors.HNAConnector.post('/activity/activitylist',body.query, {
contentType:'application/json'
}).then(
function(result){
res.send(result.statusCode,result.result);
console.log("chunjin#######HNA Activity response:" + result.result);
},
function(error){
res.send(500,error);
console.error("chunjin#######HNA Custom API error:" + error);
}
)
}catch (err) {
res.send(400,err);
}
};
有时候后端提供的SOAP的WSDL在MCS中配置的时候被认为是不合法的WSDL,这时候可以通过Custom API中拼一个报文,直接POST给后端的方式调用。
参考代码:
var request = require('request');
request({
url:"https://ucf4-psf0106-portal.oracledemos.com:443/PSIGW/PeopleSoftServiceListeningConnector/PSF0106_HR",
method: "POST",
headers: {
"content-type": "text/xml", // <--Very important!!!
'SOAPAction': "CI_CI_GAVIN_NEW_G.V1"
},
body: xml
}, function (error, response, body){
console.log("############return:");
console.log(response);
console.log("############return end");
});
*/
通过SOAP模块:
var url ='http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl';
varargs = { byProvinceName: '浙江'};
soap.createClient(url, function(err, client) {
client.getSupportCity(args, function(err,result) {
if (err) {
console.log(err);
}else {
console.log('result:' + result);
}
});
});
模块化管理是JET同angular等相比最大的优势。
JET并不是一个框架,是一个工具集。
首先要下载最新的SDK
然后把SDK中的JS文件导入到JET工程中
然后在oracle_mobile_cloud_config.js中配置MBE的信息。
注意要加上一行: "authType": "basicAuth",
如果是Oauth可以直接调用CUSTOMER API,
BASIC AUTH必须通过BACK END才能调用CUSTOMER API,所以要把该CUSTOM API加入到BACKEND中。
导入导出功能,安全的配置不会导出,需要自己重新配置一下
一般定义一个mbe.js(可从以前的工程COPY),然后就在JET中通过mbe调用Custom API,如下所示:
var successCallback = function (statusCode,message) {
console.log("successCallback");
var resJSON = message;
if (statusCode === 200) {
console.log("message=" + JSON.stringify(message));
}
}
var errorCallback = function(statusCode, message) {
// oj.Router.rootInstance.go('err');
console.error("error!!!!!!!!!!");
}
console.log("callcustomAPI#####");
mbe.invokeCustomAPI("getWeather/getWeatherbyCityName","GET", null, successCallback, errorCallback);
一个JS文件定义一个MODULE
一个模块只有一个define
Module 的名称,ID,文件名一样,
在main 中,用REQUIRE,只是自己用.
MAIN.JS是入口,相当于C的MIAN()
Require 和DEFINE区别
REQUIRE[]
FUNCTION aa
只能在定义的JS内用,别的地方用不了 aa
DEFINE相当于定义一个MODULE. 并EXPORT 出去
DEFINE[]
FUNCTION aa
别的JS能引用aa
可通过ID
Main.js中:
。。。。
ko.applyBindings(new ViewModel("Planet",
"Eartwwwwwh"),document.getElementById("xcj111"));// This makes Knockout get to work
。。。。
ko.applyBindings(new ViewMode2(),document.getElementById("xcj"));
index.html中:
First name:
Last name:
Passengername | Meal | |
---|---|---|
Mudule之间传递参数:
1. 在MAIN中定义全局变量
2. 用KNOCKOUT的POST-box插件https://github.com/rniemeyer/knockout-postbox
3. 在ATTACH 中
一般先创建一个Web模板的JET工程进行开发调试会比较快:
ojet create xxx –template=navdrawer
都弄好后转成支持mobile的。通过下面的命令完成:
ojet add hybrid --platforms=android
如果最初创建的是mobile的模板,也可以用ojet serve --browser 启动进行调试,比较快。
ojet serve android --browser
先在PROJECT目录下执行obj serve
启动成功后,在浏览器中通过http://localhost:8000/ 访问
在src目录下修改代码,刷新http://localhost:8000/ 可看到结果,不要在NETBEAN中直接运行文件。
1. Install android-studio, 里面带了SDK
需要的android版本要选中
Google USB driver要选中
2. Accept license
Execute: sdkmanager --licenses
Generate license file in:
删除目录:D:\cloud\JET\071023\mymobile\hybrid\platforms\android
在D:\cloud\JET\071023\mymobile\hybrid下执行
cordova platformadd android
重新生成目录:mymobile\hybrid\platforms\android
然后执行:
set ANDROID_HOME= C:\Android\sdk
set JAVA_HOME=c:\jdk1.8
set PATH=%JAVA_HOME%\bin;%PATH%
然后执行:ojet serve android –destination=device
在如下目录生成APK:
如果有跨域调用问题,在调试的时候,会看报明显的错误信息:
XMLHttpRequest cannot load
http://localhost:7001/TestWSProj/TestWSJSON/hello?_=1472780477458.Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin'header is present on the requested resource. Origin 'http://localhost:8383' istherefore not allowed access.
如果是Chrome浏览器可安装一个插件:
https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en-US下载
然后ENABLE它,当然也可能不好用,可以换firefox或者其他浏览器调试。
Firefox可安装CORS Everywhere 插件。
MCS connector->FIREWALL -> 后端系统
做法是到http://trustedsource.org/ 上面加
GSE环境中的MCS中的CUSTOM API调用HCM,会返回302,并重定向到oracle的LOGIN页面。目前解决方案是需要让gse support将mcs的ip地址加入到GSE的白名单中才可以。
需要加2个header: oracle-mobile-backend-id和Authorizaion
不要全部COPY. 不要替换return new mainContentViewModel();
部分。