• 云函数是一段部署在服务端的代码片段,采用 java 或 node.js 进行编写,然后部署运行在Bmob服务器
  • 通过云函数可以解决很多复杂的业务逻辑,从此无需将要将大量的数据发送到移动设备上做计算处理
  • 只需将这些计算都交由服务端运算处理,最后移动客户端仅仅需要接收云函数运算处理返回的数据结果就可以了
  • 通过更新云函数代码片段,客户端无需更新,便满足业务改动的需求。这样云函数便有更多的灵活性和自主性

调用方法

云函数提供了以下几种方式提供调用:

调用方式 所需信息 优点
SDK AppId 交互自带加密,接入快速
RestApi AppId、RestKey 所有平台适用,通用性强
Http请求 Secret Key 所有平台适用,可用浏览器打开

Android SDK

iOS SDK

C# SDK

Restful api

Http请求

日志

  • 可在Bmob后台根据时间、日志级别、内容关键字、方法名搜索想要的日志
  • 每个应用拥有最大10m的日志空间,循环写入
  • 高级用户有实时日志功能

代码规范

  • java云函数必须遵循以下格式:

    1. public static void onRequest(final Request request, final Response response, final Modules modules) throws Throwable {
    2. // 上面这个方法体,不允许任何修改
    3. // 这里使用Java编写云函数
    4. // 最后一个字符必须是 }
    5. }
  • 代码不能包含以下关键字:(保存代码时有错误提醒)

    1. Class
    2. File
    3. System
    4. ...
  • 需要获取当前毫秒时,可用 getTime()new java.util.Date().getTime() 替代 System.currentTimeMillis()
  • 如果确实需要用到被禁止使用的关键字,例如查询”File”表,可用”F”+”ile”的形式拼接
  • 不可包含/**/注释,如需注释,请用 //
  • 仅可写一个Java的方法,不能写多个方法、类变量、静态变量等
  • 云函数执行完毕后,必须用response.send方法返回响应数据,否则会被当做超时,多次超时可能会被暂停使用

Request对象

onRequest方法参数中 Request request 包含了本次请求的全部信息:

名称 类型 获取方法 示例
路径Path String request.getPath() /xxxxxxxxxxxxxxxx/test1
方法Method String request.getMethod() POST
请求头Headers JSONObject request.getHeaders() {“User-Agent”:[“Chorme”]}
请求体Body byte[] request.getBody() [98, 109, 111, 98]
Get参数 JSONObject request.getQueryParams() {“page”: “1”}
Body内参数 JSONObject request.getParams() {“username”: “zwr”}
单个请求头 String request.getHeader(String key) request.getHeader(“User-Agent”) = “Chrome”
单个Get参数 String request.getQueryParam(String key) request.getQueryParam(“page”) = “1”

Response对象

  • onRequest方法参数中 Response response 用于响应请求,返回数据
  • Response对象仅有名为 send 的方法,参数不同共有4种重载形式(Overloading):
  1. send(Object res)
  2. send(Object res, int statusCode)
  3. send(Object res, int statusCode, String statusMsg)
  4. send(Object res, int statusCode, String statusMsg, JSONObject headers)

以下是参数说明:

名称 类型 意义
res Object 返回的内容:如果为byte[]类型直接返回;否则会返回res.toString(“UTF-8”)
statusCode int 返回的Http响应状态码,例如200、404
statusMsg String 返回的Http响应状态,例如OK、NotFound
headers JSONObject 返回的头部信息,采用String-String的格式,例如{“Content-Type”: “text/plain; charset=UTF-8”}
  • 示例

    1. // 1. 直接返回字符串
    2. response.send("Hello world--Bmob");
    3. // 2. 返回404错误
    4. response.send("Error", 404, "NotFound");
    5. // 3. 返回中文字符串,需要返回包含charset的header
    6. response.send(
    7. "你好,比目",
    8. 200,
    9. "OK",
    10. JSON.toJson("Content-Type", "text/plain; charset=UTF-8")
    11. );

Modules对象

  • onRequest方法参数中 Modules modules 提供了几个模块供开发者调用:
模块名 获取方式 作用
Bmob数据库操作对象 modules.oData 封装了Bmob的大多数api,以供开发者进行快速的业务逻辑开发,详见下文 <Bmob数据操作>
日志输出对象 modules.oLog 提供了几个级别的日志输出,以便调试,详见下文 <日志输出>

日志输出

  1. // 设置需要输出的日志级别
  2. // Level_All = 0
  3. // Level_Debug = 1
  4. // Level_Warn = 2
  5. // Level_Error = 3
  6. modules.oLog.level = modules.oLog.Level_All // 全部都会输出
  7. modules.oLog.level = modules.oLog.Level_Warn // 仅输出Warn和Error
  8. modules.oLog.level = modules.oLog.Level_Error // 仅Error级别日志
  9. modules.oLog.d(Object) // 输出Debug级别日志
  10. modules.oLog.w(Object) // 输出Warn级别日志
  11. modules.oLog.e(Object) // 输出Error级别日志
  12. modules.oLog.debug(String,Object...) // 格式化输出Debug级别日志
  13. modules.oLog.warn(String,Object...) // 格式化输出Warn级别日志
  14. modules.oLog.error(String,Object...) // 格式化输出Error级别日志

Bmob数据操作

以下均为 modules.oData 的方法:

方法体 返回值 描述
setDomain(String) this 设置请求的域名,仅迁移用户需要使用
setTimeout(int) this 设置超时时间(单位:毫秒),与云函数超时无关
setHeader(String…) this 设置请求头
setHeader(JSONObject) this 设置请求头
setUserSession(String) this 设置用户的Session Token
setMasterKey(String) this 设置应用的Master Key
insert(String table,JSONObject data) HttpResponse 往数据表中添加一行
remove(String table,String objectId) HttpResponse 删除数据表中的一行
update(String table,String objectId,JSONObject data) HttpResponse 更新数据表中的一行
find(Querier) HttpResponse 使用查询器查询数据
findOne(String table,String objectId) HttpResponse 查询数据表中的一行
uploadfile(String fileName,bytes[] bytes) HttpResponse 上传一个文件
uploadfile(String fileName,bytes[] bytes,String contentType) HttpResponse 上传一个文件,并指定格式
deletefile(String cdnName,String url) HttpResponse 删除文件
deletefiles(JSONObject) HttpResponse 批量删除文件
bql(String,Object…) HttpResponse 使用BQL查询
userSignUp(JSONObject) HttpResponse 用户注册
userLogin(String username,String password HttpResponse 用户通过账号、密码登陆
userLoginBySMS(String mobile, String smsCode,JSONObject userInfo) HttpResponse 用户通过短信验证码一键注册或登录
userResetPasswordByEmail(String email) HttpResponse 用户请求Email重置密码
userResetPasswordBySMS(String smsCode,String password) HttpResponse 用户通过短信验证码重置密码
userResetPasswordByPWD(String userId,String session, String oldPassword, String newPassword) HttpResponse 用户通过旧密码修改新密码
sendCustomSMS(String mobile, String content) HttpResponse 发送自定义短信
sendSMSCode(String mobile, String template) HttpResponse 发送某模版的短信验证码
verifySMSCode(String mobile, String smsCode) HttpResponse 验证短信验证码
payQuery(String orderId) HttpResponse 查询支付订单
cloudCode(String funcName, JSONObject body) HttpResponse 调用云函数
push(JSONObject body) HttpResponse 向客户端推送消息
roleInsert(JSONObject data) HttpResponse ACL:创建角色
roleFindOne(String roleId) HttpResponse ACL:查询角色
roleUpdate(String roleId, JSONObject data) HttpResponse ACL:修改角色
roleDelete(String roleId) HttpResponse ACL:删除角色
getDBTime() HttpResponse 获取Restful服务器的时间
batch(JSONArray requests) HttpResponse 批量请求

内置类

HttpResponse

类变量:

变量名 类型 描述
err String 错误信息
res ResponseStatus 请求状态(见下表)
data byte[] 返回的数据
stringData String 返回的数据转String格式
jsonData JSONObject 返回的数据转JSON格式

ResponseStatus

类变量:

变量名 类型 描述
code int 状态码
status String 状态描述
headers JSONObject 返回的Http头部

Querier

类方法:

方法体 描述
\(String table) 构造方法,传入表名
Querier limit(int) 设置最大返回行数
Querier skip(int) 设置跳过的个数
Querier order(String) 排序规则
Querier keys(String) 需要返回的属性
Querier include(String) 需要返回详细信息的Pointer属性
Querier where(JSONObject) 设置查询条件

BmobUpdater

该类的全部静态方法都用于设置insert、update方法的请求内容

静态方法

方法体 描述
JSONObject add(JSONObject data,String key,Object value) 往data添加一个键值
JSONObject increment(JSONObject data,String key,Number number) 原子计数
JSONObject arrayAdd(JSONObject data,String key,Object obj) 往Array类型添加一项
JSONObject arrayAddAll(JSONObject data,String key,JSONArray objects) 往Array类型添加多项
JSONObject arrayAddUnique(JSONObject data,String key,Object obj) 往Array类型不重复地添加一项
JSONObject arrayAddAllUnique(JSONObject data,String key,JSONArray objects) 往Array类型不重复地添加多项
JSONObject arrayRemoveAll(JSONObject data,String key,JSONArray objects) 删除Array类型的多项
JSONObject addRelations(JSONObject data, String key,BmobPointer…pointers) 添加多个Relation关系
JSONObject removeRelations(JSONObject data, String key,BmobPointer…pointers) 移除多个Relation关系

JSON

静态方法:

  1. String stringify(JSONObject m)
  2. String stringify(JSONArray m)
  3. JSONObject parse(String s)
  4. JSONArray parseArray(String s)
  5. JSONObject setJson(JSONObject json, Object... kNvs)
  6. JSONArray append(JSONArray array, Object... objs)
  7. JSONArray toArray(Object... objs)
  8. JSONObject strsToJson(String... kNvs)
  9. JSONObject toJson(Object... kNvs)

JSONObject

类方法:

  1. int size()
  2. boolean isEmpty()
  3. boolean containsKey(Object key)
  4. boolean containsValue(Object value)
  5. Object get(Object key)
  6. Object put(String key, Object value)
  7. Object remove(Object key)
  8. void clear()
  9. Set<String> keySet()
  10. BigInteger getBigInteger(String key)
  11. BigDecimal getBigDecimal(String key)
  12. Boolean getBoolean(String key)
  13. boolean getBooleanValue(String key)
  14. Byte getByte(String key)
  15. byte getByteValue(String key)
  16. Date getDate(String key)
  17. Double getDouble(String key)
  18. double getDoubleValue(String key)
  19. Float getFloat(String key)
  20. float getFloatValue(String key)
  21. Integer getInteger(String key)
  22. int getIntValue(String key)
  23. JSONArray getJSONArray(String key)
  24. JSONObject getJSONObject(String key)
  25. Long getLong(String key)
  26. long getLongValue(String key)
  27. Short getShort(String key)
  28. short getShortValue(String key)
  29. String getString(String key)

JSONArray

类方法:

  1. int size()
  2. boolean isEmpty()
  3. boolean contains(Object o)
  4. boolean add(Object e)
  5. boolean remove(Object o)
  6. boolean containsAll(Collection<?> c)
  7. boolean addAll(Collection<? extends Object> c)
  8. boolean addAll(int index, Collection<? extends Object> c)
  9. boolean removeAll(Collection<?> c)
  10. boolean retainAll(Collection<?> c)
  11. void clear()
  12. Object get(int index)
  13. Object set(int index, Object element)
  14. void add(int index, Object element)
  15. Object remove(int index)
  16. BigInteger getBigInteger(int index)
  17. BigDecimal getBigDecimal(int index)
  18. Boolean getBoolean(int index)
  19. boolean getBooleanValue(int index)
  20. Byte getByte(int index)
  21. byte getByteValue(int index)
  22. Date getDate(int index)
  23. Double getDouble(int index)
  24. double getDoubleValue(int index)
  25. Float getFloat(int index)
  26. float getFloatValue(int index)
  27. Integer getInteger(int index)
  28. int getIntValue(int index)
  29. JSONArray getJSONArray(int index)
  30. JSONObject getJSONObject(int index)
  31. Long getLong(int index)
  32. long getLongValue(int index)
  33. Short getShort(int index)
  34. short getShortValue(int index)
  35. String getString(int index)

BmobPointer

构造方法:

  1. BmobPointer(String className, String objectId)

Bmobfile

构造方法:

  1. Bmobfile(String filename, String url)

BmobDate

构造方法:

  1. BmobDate(String timeStamp)
  2. BmobDate(long millSec)

BmobGeoPoint

构造方法:

  1. BmobGeoPoint(double longitude, double latitude)

AES

静态方法:

  1. byte[] aes(byte[] str, byte[] key, byte[] iv, boolean eOd, String keyAlgorithm, String cipherAlgorithm)
  2. byte[] Encode(byte[] content, byte[] key, byte[] iv)
  3. byte[] Decode(byte[] content, byte[] key, byte[] iv)

Base64

静态方法:

  1. String Encode(byte[] data)
  2. byte[] Decode(String str)

Crypto

静态方法:

  1. String Encode(String algorithm, String content)
  2. String Encode(String algorithm, byte[] bytes)
  3. byte[] EncodeToBytes(String algorithm, byte[] bytes)
  4. String Bytes2Hex(byte bytes[])
  5. String Bytes2Hex(byte bytes[], int offset, int length)

GZip

静态方法:

  1. byte[] Decode(byte[] bytes)
  2. byte[] Encode(byte[] bytes)

MD5

静态方法:

  1. String Encode(String content)
  2. String Encode(byte[] bytes)
  3. byte[] EncodeToBytes(byte[] bytes)

RSA

静态方法:

  1. KeyPair GenerateKeys()
  2. KeyPair RestoreKeys(byte[] keyBytes)
  3. PublicKey ParsePublicKey(byte[] keyBytes)
  4. byte[] Encode(PublicKey pubKey, byte[] content)
  5. byte[] Decode(PrivateKey priKey, byte[] content)
  6. byte[] Sign(PrivateKey priKey, byte[] content)
  7. boolean Verify(PublicKey pubKey, byte[] content, byte[] sign)

SHA1

静态方法:

  1. String Encode(String content)
  2. String Encode(byte[] bytes)
  3. byte[] EncodeToBytes(byte[] bytes)

内置方法:

  1. long getTime() // 获取当前毫秒
  2. String fmt(String, Object...) // 格式化
  3. JSON.toJson(Object...) // Json化
  4. JSONObject JSON.parse(String) // String转JSONObject
  5. JSONArray JSON.parseArray(String) // String转JSONArray
  6. boolean isStrEmpty(String) // 判断字符串是否为空
  7. arraycopy(Object from, int fromOffset, Object to, int toOffset, int length) // 复制数组内容

示例:

  • 场景1:

    用户在app提交了反馈,参数有”userObjectId”、”title”、”content”、”type”,需要保存到FeedBack表

    1. JSONObject params = request.getParams();
    2. String title = params.getString("title");
    3. String content = params.getString("content");
    4. String userId = params.getString("userObjectId");
    5. int type = params.getIntValue("type");
    6. JSONObject data = JSON.toJson(
    7. "title", title,
    8. "content", content,
    9. "type", type
    10. );
    11. BmobUpdater.add(
    12. data,
    13. "user",
    14. new BmobPointer("_User", userId)
    15. );
    16. response.send(
    17. modules.oData.insert(
    18. "Feedback",
    19. data
    20. ).stringData
    21. );
  • 场景2:

    查询Feedback表中,type为1、title字段不为空,且创建时间在12小时以内的最新10条数据,并只需要反馈content和对应user的用户名

    1. Querier q = new Querier("Feedback")
    2. .limit(10)
    3. .include("user")
    4. .order("-createdAt");
    5. q.addWhereEqualTo("type", 1);
    6. q.addWhereExists("title");
    7. q.addWhereGreaterThanOrEqualTo("createdAt",
    8. new BmobDate(getTime() - 12 * 60 * 60 * 1000)
    9. );
    10. HttpResponse res = modules.oData.find(q);
    11. JSONArray feedbacks = res.jsonData.getJSONArray("results");
    12. if (feedbacks == null)// 请求有错误,直接返回全部内容
    13. response.send(res.data);
    14. else {
    15. JSONArray arr = new JSONArray();
    16. for (int i = 0, l = feedbacks.size(); i < l; i++) {
    17. JSONObject fb = feedbacks.getJSONObject(i);
    18. JSONObject user = fb.getJSONObject("user");
    19. arr.add(
    20. JSON.toJson(
    21. "username",
    22. user == null ? null : user.getString("username"),
    23. "content",
    24. fb.getString("content")
    25. )
    26. );
    27. }
    28. response.send(JSON.toJson("results", arr));
    29. }

注意事项

  • 如果你编写的Java云函数经常发生运行超时、上下行超流量、滥用内存等现象,官方将会自动封停你的云函数功能,修改后向客服申请方可继续使用

  • 如果某接口调用频率较高,超过默认并发量,则会直接返回错误,解决方法:

    1. 1.修改客户端代码,降低请求频率
    2. 2.修改云函数,提高代码质量和效率,减少网络请求相关的超时时长,尽快结束工作
    3. 3.购买更高的并发配置
  • 如果需要接受更大的请求体,或返回更大的结果,请购买更高的配置