# 云代码Android调用指南
## 简介
云代码是部署运行在 DroiBaaS 云引擎上的代码,您可以用它来实现较复杂的,需要运行在云端的业务逻辑。
从客户端执行 DroiBaaS 云代码,使用基础类 DroiCloud 并结合基础类 DroiObject 来定义输入以及输出即可操作云代码。
目前支持 lua,其他语言尽请期待。
## 执行CloudCode
### 使用DroiCloud类
`DroiBaaS` API 服务可以让开发人员编写 REST API,并可用 ApiKey 控制开放范围。
> **注意:** `apiPath`参数需要您在网页填写的`URI`前添加`/api/v2/`。比如您的`URI`为`yourapi`,则完整的`apiPath`为`/api/v2/yourapi`
调用方式如下:
``` java
// 同步方法
DroiCloud.callRestApi(String apiKey, String apiPath, Method method, String params,
DroiError error);
DroiCloud.callRestApi(String apiKey, String apiPath, Method method, String params,
String token, DroiError error);
DroiCloud.callRestApi(String apiKey, String apiPath, Method method, T params,
Class resultType, DroiError error);
DroiCloud.callRestApi(String apiKey, String apiPath, Method method, T params,
Class resultType, String token, DroiError error);
```
``` java
// 异步方法
DroiCloud.callRestApiInBackground(String apiKey, String apiPath, DroiCloud.Method method,
String params, DroiCallback callback);
DroiCloud.callRestApiInBackground(String apiKey, String apiPath, DroiCloud.Method method,
String params, String token, DroiCallback callback);
DroiCloud.callRestApiInBackground(String apiKey, String apiPath, DroiCloud.Method method,
T params, Class resultType, DroiCallback callback);
DroiCloud.callRestApiInBackground(String apiKey, String apiPath, DroiCloud.Method method,
T params, Class resultType, String token, DroiCallback callback);
```
> **注意:** 当`method`参数为`DroiCloud.Method.GET`或`DroiCloud.Method.DELETE`时,`params`参数必须要传入`null`。`token`参数为当你需要调用其他`DroiBaaS`应用下的`api`时需要传入,获取`token`可以使用`restApi`中的[DroiUser注册&登录](https://www.droibaas.com/html/doc_24715.html#wx-36)或者云代码。
以下方法后续版本会被废弃`@Deprecated`
``` java
DroiCloud.callCloudServiceInBackground(String apiKey, String apiPath, DroiCloud.Method method,
String params, DroiCallback callback);
DroiCloud.callCloudServiceInBackground(String apiKey, String apiPath, DroiCloud.Method method,
T params, DroiCallback callback, Class resultType);
```
开发者可从客户端调用存放于 DroiBaaS 的 CloudCode。通过 DroiCloud 类的 callCloudService 来指定要执行的 CloudCode,想传入的参数,以及接受 CloudCode 的执行结果,以及相关的 DroiError。
> **注意:** callCloudService 已不建议使用,将会在后续版本移除。请改用 callRestApi。
``` java
DroiCloud.callCloudService(String name, T params, Class resultType, DroiError error);
DroiCloud.callCloudServiceInBackground(String name, T params,
DroiCallback callback, Class resultType)
```
### 限制
从客户端只能调用 Entry 云代码, 相关定义请参照[云代码 - Entry 云代码](http://www.droibaas.com/html/doc_24269.html#Entry)
### sample
我们提供的 Lua sample CloudCode 中有一个名为 add.lua 的示例。他可以处理两个数字相加并回传其结果。
``` lua
local Logger = require("DroiCloud.CloudLogger")
local _M = {}
function _M.main(request)
local response = {}
Logger.log(Logger.DEBUG, "add")
if request then
local cal = request.num1 + request.num2
--Put result in a table and return it.
response['result'] = cal
end
return response
end
return _M
```
若是想要执行 add.lua, 则可以通过下面的程序片段即可:
> **提醒:** 请阅读 [继承基础类```DroiObject```](http://www.droibaas.com/html/doc_24125.html#DroiObjectExtension),切记需要把`Add.Request`和`Add.Response`注册到`DroiObject`。
``` java
public class Add {
// Input
public static class Request extends DroiObject {
@DroiExpose
public float num1;
@DroiExpose
public float num2;
}
// Output
public static class Response extends DroiObject {
@DroiExpose
public float result;
}
}
// v2版本调用方式
public String testAdd() {
String apiKey = "";
String apiPath = "/api/v2/add";
Add.Request request = new Add.Request();
request.num1 = 1;
request.num2 = 2;
// 同步方法
DroiError droiError = new DroiError();
Add.Response response = null;
response = DroiCloud.callRestApi(apiKey, apiPath, DroiCloud.Method.POST, request,
Add.Response.class, droiError);
// 异步方法
DroiCloud.callRestApiInBackground(apiKey, apiPath, DroiCloud.Method.POST, request,
Add.Response.class,
new DroiCallback() {
@Override
public void result(Add.Response response, DroiError droiError) {
// 结果处理
}
});
}
// v1版本,已不建议使用
public void testAddOld() {
Add.Request request = new Add.Request();
Add.Response response = null;
request.num1 = 1;
request.num2 = 2;
String target_lua = "add.lua";
DroiError droiError = new DroiError();
response = DroiCloud.callCloudService(target_lua, request, Add.Response.class, droiError);
}
```