云端代码的实践
优采云 发布时间: 2020-08-20 02:40云端代码的实践
Bmob的云端代码 可以由手机发起恳求调用在云端你写好的方式(需要js来写),比如可以在手机端 用户注册成功的时侯,调用云端代码,把帐号密码作为参数调用,云端代码中可以得到参数,做希望做的操作,再把结果返回。
官方的简单事例如下
先看云端代码 在事例中云端领到手机端传入的参数 然后按照参数 返回结果 很简单
1 function onRequest(request, response, modules) {
2 //获取SDK客户端上传的name参数
3 var name = request.body.name;
4 if(name == 'bmob')
5 response.end('欢迎使用Bmob');
6 else
7 response.end('输入错误,请重新输入');
8 }
再瞧瞧android是如何调用的 要注意的是逻辑名 和 传入的参数 回调和bmob数据服务一样,都很简单
//test对应你刚刚创建的云端逻辑名称
String cloudCodeName = "test";
JSONObject params = new JSONObject();
//name是上传到云端的参数名称,值是bmob,云端逻辑可以通过调用request.body.name获取这个值
params.put("name", "bmob");
//创建云端逻辑对象
AsyncCustomEndpoints cloudCode = new AsyncCustomEndpoints();
//异步调用云端逻辑
cloudCode.callEndpoint(MainActivity.this, cloudCodeName, params, new CloudCodeListener() {
//执行成功时调用,返回result对象
@Override
public void onSuccess(Object result) {
Log.i("bmob", "result = "+result.toString());
}
//执行失败时调用
@Override
public void onFailure(String err) {
Log.i("bmob", "BmobException = "+err);
}
});
当然事例上面的这些功能可以说没有任何作用
这里我刚好遇见一个不错的实践案例
环信IM sdk 用户体系集成, 这块须要用到RESTAPI,我的思路是 在手机端 注册帐号 成功的同时,我发起云端代码恳求,让云端通过REST API去注册环信IM的帐号
这里要讲一下环信帐号体系:它的用户名能是 我的用户表中primarykey 密码可以是一样的密码,当然可以做一下hash加密
bmob用户注册成功时能得到用户对象,在成功的时侯把 需要的参数 带进 云端方式,如 用户名和密码 ,或者primarykey 和密码
android端 代码就不写了
通过环信的,了解到即使开发注册可以不需要token,但是更新用户信息还是要token
所以我就先用云端方式恳求token 方式名就叫 getToken
1 function onRequest(request, response, modules) {
2
3 var options = {
4 url:"https://a1.easemob.com/xxxxx/yyyyy/token",
5 headers:{
6 'Content-Type':'application/json'
7 },
8
9 body:JSON.stringify({"grant_type":"client_credentials","client_id":"YXA6GxnwsG5REeaEG_efUTmSlQ","client_secret":"YXA62p6WEWM8TRbmLQkCMxuzmQrLj3A"})
10 };
11
12 modules.oHttp.post(options,function(err,resp,body){
13 response.end(body);
14 });
15
16 }
首先第4行 url的格式 其中的xxxxx 和yyyyy 在控制台的 应用标示(A*敏*感*词*ey) 里面能看到 A*敏*感*词*ey的格式是xxxxx#yyyyy
第5行的Request Headers 就一个 没啥好说的
第9行的 Request Body 一共3个网路恳求参数第一个grant_type :client_credentials 应该是固定的,后面的client_id,client_secret同样可以在控制台找到
第12行就是发送post恳求了 最后response.end 返回结果 有效期近60天
Response Body
{
"code": 200,
"msg":
{"access_token":"YWMtIwcQoHgfEeaBFQdWz-nlJwAAAVhOT3hk1ujuKlQwidZ7zUbRcMwrDSXdYK0","expires_in":5183999,"application":"1b19f0b0-6e51-11e6-841b-f79f51399295"}
}
这些参数都是 我在云端写死了,当然可以用android端通过JSONObject带过来 云端再从request上面获取参数
不过相比android端更改参数太麻烦(要重新打包安装),而云端代码直接编辑完才能生效,所以我认为没有特殊要求,在后台写死反倒好些
拿到token以后,再来瞧瞧注册,分开放注册和授权注册,前者不需要token,后者须要
这里演示授权注册
1 function onRequest(request, response, modules) {
2
3 var username = request.body.username;
4 var password = request.body.password;
5 var token=request.body.token;
6
7 var options = {
8 url:"https://a1.easemob.com/xxxx/yyy/user",
9 headers:{
10 'Content-Type':'application/json',
11 'Authorization':'Bearer '+token
12 },
13
14 body:JSON.stringify({"username":username,"password":password})
15 };
16
17 modules.oHttp.post(options,function(err,resp,body){
18 response.end(body);
19 });
20
21 }
3 4 5行都是 带入的参数,用户名密码还有token这种东西不可能写死
第8行 url 后缀弄成了user
第11行 由于是授权注册 要传入token,所以Request Headers多了一个 ,bearer其实是指 token类型
第14行 注册必备 , 17 18返回结果
贴个注册成功的返回
Response Body
{
"code": 200,
"msg":
{
"action" : "post",
"application" : "1b19f0b0-6e51-11e6-841b-f79f51399295",
"path" : "/users",
"uri" : "https://a1.easemob.com/feizaojilao/demonim/users",
"entities" : [ {
"uuid" : "2cdf2680-781f-11e6-88b9-3576146210eb",
"type" : "user",
"created" : 1473598597352,
"modified" : 1473598597352,
"username" : "22222w22222232",
"activated" : true
} ],
"timestamp" : 1473598597360,
"duration" : 0,
"organization" : "xxxx",
"applicationName" : "yyyy"
}
}
已经被注册过了的返回
Response Body
{
"code": 200,
"msg":
{"error":"duplicate_unique_property_exists","timestamp":1473599067876,"duration":0,"exception":"org.apache.usergrid.persistence.exceptions.DuplicateUniquePropertyExistsException","error_description":"Application null Entity user requires that property named username be unique, value of 22222w22222232 exists"}
}
我觉得这个云端代码十分强悍,手机端只要上传参数,让云端来操作,就能得到结果,极大的减少了手机的任务
目前也没更多的场景能使用,以后遇到了,会更新