MCS + JET学习笔记

MCS + JET学习笔记

MBE, Custom API, Connector之间的关系

如下图,一个Custom API可以属于多个MBE, 一个Custom API可以调用多个Connector.

这样可以松耦合,可以复用。把通用的安全设置放在MBE, MBE相当于一个入口。

 

Connector配置

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调用Connector

在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获取传入的Request参数

先在Custom API的Resource中配置参数

然后在Custom API的实现代码中通过req.query.参数名获取,见上面的例子。

console.log("request queryviewid:" + req.query.viewid );

 

Custom API调用Connector的一个例子

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);

 

            // HNAConnectorCONNECTOR的名字

            ///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);

                   }

 

         };

 

如何调用MCS不认识的SOAP服务

有时候后端提供的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");

});

*/

Nodejs调用SOAP

通过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同其他开源JS框架的区别

模块化管理是JET同angular等相比最大的优势。

JET并不是一个框架,是一个工具集。

 

JET调用Custom API

首先要下载最新的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);

 

 MODULE, DEFINE,REQUIRE

一个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

        

一个JS中定义多个VIEWMODULE,如果通过KO绑定到HTML中

可通过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中:

<divid="xcj111">   

   <p>First name: <input data-bind='value: firstName'/></p>

   <p>Last name: <input data-bind='value: lastName'/></p>

   <h2>Hello, <span data-bind='text: fullName'> </span>!</h2> 

</div>

 

<divid="xcj">

<h2>Your seat reservations</h2>

 

<table>

   <thead><tr>

       <th>Passengername</th><th>Meal</th><th></th>

   </tr></thead>

   <tbody data-bind="foreach: seats">

       <tr>

           <td data-bind="text: firstName"></td>

           <td data-bind="text: lastName"></td>

          

       </tr>   

   </tbody>

</table>

</div>

 

Router定义不同MODULE之间的跳转

Mudule之间传递参数:

1.      在MAIN中定义全局变量

2.      用KNOCKOUT的POST-box插件https://github.com/rniemeyer/knockout-postbox

3.      在ATTACH 中

 

JET web转Mobile

一般先创建一个Web模板的JET工程进行开发调试会比较快:

ojet create xxx –template=navdrawer

都弄好后转成支持mobile的。通过下面的命令完成:

ojet add hybrid --platforms=android

 

如果最初创建的是mobile的模板,也可以用ojet serve --browser 启动进行调试,比较快。

ojet serve android  --browser

 

JET调试

先在PROJECT目录下执行obj serve

启动成功后,在浏览器中通过http://localhost:8000/ 访问

在src目录下修改代码,刷新http://localhost:8000/ 可看到结果,不要在NETBEAN中直接运行文件。

Build android APK过程

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要连接的外部系统的IP加到白名单中

MCS  connector->FIREWALL -> 后端系统

 

做法是到http://trustedsource.org/ 上面加

 

 

CUSTOM API调用HCM,返回302问题

GSE环境中的MCS中的CUSTOM API调用HCM,会返回302,并重定向到oracle的LOGIN页面。目前解决方案是需要让gse support将mcs的ip地址加入到GSE的白名单中才可以。

 

POSTMAN中测试CUSTOM API

需要加2个header: oracle-mobile-backend-id和Authorizaion

 

从JET COOKBOOK COPY代码注意

不要全部COPY. 不要替换return new mainContentViewModel();

部分。

 



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值