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 用户体系集成, 这块需要用到REST API ,我的思路是 在手机端 注册账号 成功的同时,我发起云端代码请求,让云端通过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的格式 https://a1.easemob.com/xxxxx/yyyyy/token 其中的xxxxx 和yyyyy 在控制台的 应用标识(AppKey) 里面能看到 AppKey的格式是 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"} }
我认为这个云端代码非常强大,手机端只要上传参数,让云端来操作,就能得到结果,极大的减轻了手机的任务
目前也没更多的场景能使用,以后碰到了,会更新