# 云代码iOS调用指南
## 简介
云代码(CloudCode)是部署运行在 DroiBaaS 云引擎上的代码,您可以用它来实现较复杂的,需要运行在云端的业务逻辑。DroiBaaS 希望帮助开发者无需处理服务器逻辑便可简单的开发出各种 App,只需要编写额外的的逻辑程序上传至 DroiBaaS 即可。这类逻辑程序即为云代码。目前 DroiBaaS 能处理以 lua 脚步语言编写的云代码。
## 执行 CloudCode
### 使用 DroiCloud 类
`DroiBaaS` API 服务可让开发者编写 REST Api,并且可以用 ApiKey 控制开放范围。
> **注意:** `apiPath`参数需要您在网页填写的`URI`前添加`/api/v2/`。比如您的`URI`为`yourapi`,则完整的`apiPath`为`/api/v2/yourapi`
呼叫方式如下
* Objective-C
``` objc
+ (NSString*) callRestApi : (NSString*) apiKey apiPath:(NSString*) apiPath method:(DroiCloudMethod) method parameter: (NSString*) parameter error:(DroiError**) error;
```
* Swift
``` swift
callRestApi(_ apiKey: String!, apiPath: String!, method: DroiCloudMethod, parameter: DroiObject!, andClassType clazz: Swift.AnyClass!, error: AutoreleasingUnsafeMutablePointer!) -> Any!
```
非同步呼叫方式
* Objective-C
``` objc
+ (NSString*) callRestApiInBackground : (NSString*) apiKey apiPath:(NSString*) apiPath method:(DroiCloudMethod) method parameter: (DroiObject*) parameter andCallback : (DroiCloudCallback) callback withClassType : (Class) clazz;
```
* Swift
``` swift
callRestApi(inBackground apiKey: String!, apiPath: String!, method: DroiCloudMethod, parameter: DroiObject!, andCallback callback: DroiCoreSDK.DroiCloudCallback!, withClassType clazz: Swift.AnyClass!) -> String!
```
开发者可以从客户端呼叫存放于 DroiBaaS 的 CloudCode. 通过调用 DroiCloud 类的接口 callCloudService 来指定欲执行的 CloudCode, 并且可以传入参数, 以及接收 CloudCode 的执行结果和相关错误 (DroiError)。
> **注意:** callCloudService 已不建议使用,将会在后续版本移除。请改用 callRestApi。
* Objective-C
```objc
+ (id) callCloudService : (NSString*) name
parameter : (DroiObject*) parameter
andClassType : (Class) clazz
error:(DroiError**) error;
```
* Swift
```swift
DroiCloud.callCloudService(name: String!, parameter: DroiObject!, andClassType: AnyClass!, error: AutoreleasingUnsafeMutablePointer)
```
也可以调用 DroiCloud 类的 callCloudServiceInBackground 接口后台运行
* Objective-C
```objc
+ (NSString*) callCloudServiceInBackground : (NSString*) name
parameter : (DroiObject*) parameter
andCallback : (DroiCloudCallback) callback
withClassType : (Class) clazz;
```
* Swift
```swift
DroiCloud.callCloudServiceInBackground(name: String!, parameter: DroiObject!, andCallback: DroiCloudCallback!, withClassType: anyClass!)
```
> **注意:** 从客户端只能调用 Entry 云代码, 相关定义请参照[云代码 - Entry 云代码](http://www.droibaas.com/html/doc_24269.html#Entry)
### sample
我们提供的 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 并扩充存储数据属性](https://www.droibaas.com/html/doc_24124.html#DroiObjectExtension),切记需要 `AddInput ` 和 `AddResult` 注册到 `DroiObject`。
* Objective-C
```objc
@interface AddInput : DroiObject
DroiExpose
@property float num1;
DroiExpose
@property float num2;
@end
@implementation AddInput
@end
@interface AddResult : DroiObject
DroiExpose
@property float result;
@end
@implementation AddResult
@end
- (void) callSimpleCloudCode {
AddInput* addInput = [AddInput new];
addInput.num1 = 1.0;
addInput.num2 = 2.0;
DroiError* error;
AddResult* addResult = [DroiCloud callRestApi:@"APIKey" apiPath:@"/api/v2/add" method:DROIMETHOD_POST parameter:addInput andClassType:AddResult.class error:&error];
}
// 不建议使用 callCloudService
// - (void) callSimpleCloudCode() {
// AddInput* addInput = [AddInput new];
// addInput.num1 = 1.0;
// addInput.num2 = 2.0;
// AddResult* addResult = [DroiCloud callCloudService:@"add.lua" parameter:addInput andClassType:[AddResult class] error:nil];
// NSLog(@"Result: %d", addResult);
// }
@end
// 不建议使用 callCloudService
//- (void) callSimpleCloudCodeInBG {
// AddInput* addInput = [AddInput new];
// addInput.num1 = 1.0;
// addInput.num2 = 2.0;
// DroiTaskDispatcher* taskDispatcher = [DroiTaskDispatcher getTaskDispatcher:BackgroundThreadDispatcher];
// [taskDispatcher enqueueTask:^{
// [DroiCloud callCloudServiceInBackground:@"add.lua" parameter:addInput andCallback:^(AddResult *addResult , DroiError *error) {
// XCTAssertNotEqual(addResult.result, 0.0);
// } withClassType:[AddResult2 class]];
//}];
// AddResult* addResult = [DroiCloud callCloudService:@"add.lua" parameter:addInput andClassType:[AddResult2 class] error:nil];
// XCTAssertNotEqual(addResult.result, 0.0);
}
```
* Swift
```swift
import DroiCoreSDK.DroiObject
import DroiCoreSDK.DroiCloud
class AddInput : DroiObject{
// DroiExpose
var num1: Float = 0.0
// DroiExpose
var num2: Float = 0.0
}
class AddResult : DroiObject{
// DroiExpose
var result: Float = 0.0
}
func callSimpleCloudCode() {
var error: DroiError? = nil
let addInput = AddInput()
addInput.num1 = 1.0
addInput.num2 = 2.0
let addResult = DroiCloud.callRestApi("APIKey", apiPath: "/api/v2/add", method: .DROIMETHOD_POST, parameter: addInput, andClassType: AddResult.self, error: &error)
}
// 不建议使用 callCloudService
//func callSimpleCloudCode(){
// let target_cloudcode_name = "add.lua"
// var error: DroiError? = nil
// let addInput = AddInput()
// addInput.num1 = 1.0
// addInput.num2 = 2.0
// var addResult = AddResult()
// addResult = DroiCloud.callCloudService(target_cloudcode_name, parameter: addInput, andClassType: AddResult.self, error: &error) as! AddResult!
}
// 不建议使用 callCloudService
//func callSimpleCloudCodeInBG(){
// let disp = DroiTaskDispatcher.getTaskDispatcher("123")
// disp.enqueueTask {
// DroiCloud.callCloudServiceInBackground(self.target_cloudcode_name, parameter: self.addInput, andCallback:
// {
// (addResult, error) in
// XCTAssertNotEqual(addResult.result, 0.0, "Not a valiad calcuation")
// }
// , withClassType: AddResult.self)
// }
// sleep(3)
//}
```