فراخوانی یک تابع - Unity
در این بخش با چند مثال ساده نحوه اتصال به سرویس رایانش را شرح خواهیم داد.
پیشنیازها
- در صورتی که با سرویس رایانش آشنایی ندارید، به معرفی سرویس رایانش مراجعه کنید.
- در صورتی که هنوز با تنظیمات پنل سرویس رایانش آشنا نشدهاید و یک تابع در آن جا نساختهاید، به تنظیمات پنل رایانش مراجعه کنید.
- در صورتی که با سرویس کاربران آشنایی ندارید، به معرفی سرویس کاربران مراجعه کنید.
- در صورتی که هنوز SDK یونیتی را راهاندازی نکردهاید، به راهاندازی SDK بکتوری در یونیتی مراجعه کنید.
وظایف SDK بکتوری
سرویس رایانش همانطور که میدانید شامل تعدادی تابع است که منطق اپلیکیشن شما را در خود دارد. هر تابع یک نام یکتا دارد و با همان نام شناخته میشود، و میتواند بسته به منطقی که شما پیادهسازی کردهاید دارای یک شیء (Object) ورودی و یک شیء خروجی باشد. SDK یونیتی رایانش، جهت سهولت کار شما، تمامی جزییاتِ
- تبدیل و ارسال اشیا
- فراخوانی تابع
- دریافت جواب و تبدیل جواب به اشیا
را انجام میدهد و شما نیازی به درگیرشدن در این جزییات تکراری ندارید.
ایجاد یک مثال کاربردی
فرض کنید اپلکیشن شما یک فروشگاه آنلاین است و تابعی که شما قصد فراخوانی آن را دارید موجودی یک کالا را در سرور چک میکند و به شما خبر میدهد که آیا امکان خرید آن را دارید یا نه. تصور کنید که نام این تابع check_availability است و شما کدی مشابه زیر را در سرویس رایانش (در پنل وبسایت بکتوری) برای آن نوشتهاید:
// import backtory sdk for real usage, not in this example
var Backtory = require('backtory-sdk');
// Body of code in server
exports.handler = function(requestBody, context) {
// Step 1: extract data from request
var requestedCount = requestBody.count;
var productId = requestBody.id;
// Step 2: your logic here
// TODO: Query to database if product is available for sale
var isAvailable = requestedCount < 10 && productId == 'iPhone 6 Plus 64GB' ? true : false;
// TODO: Query to database for price of product
var unitPrice = productId == 'iPhone 6 Plus 64GB' ? 26000000 : -1;
// Step 3: send result to android device
context.succeed({
ok: isAvailable,
price: unitPrice
});
};
کد بالا سه کار زیر را انجام میدهد:
- از ورودی (requestBody) دو مقدار count و id را دریافت میکند. این دو فیلد توسط شما از اپلیکیشن خرید ارسال میشود. فیلد id نشان میدهد که قصد خرید چه کالایی را دارید و فیلد count نشانگر تعداد مورد نیاز شماست.
- کد رایانش باید به پایگاهداده پروژه شما در بکتوری وصل شود و موجودی کالای درخواستی را بررسی کند. در مثال بالا، کد ساده ما چک میکند در صورتی که درخواست برای آیفون ۶۴ گیگابایتی باشد و تعداد درخواستی هم کمتر از ۱۰ عدد باشد پاسخ OK میدهد. قیمت واحد کالا هم در کد بالا در صورتی که آیفون ۶۴ گیگابایتی باشد برابر دو میلیون و ششصد هزار تومان و در غیر این صورت نامشخص (1-) است.
- در پاسخ به درخواست اپلیکیشن پاسخی به کمک دستور context.succeed بازگردانده میشود که دو فیلد ok و price دارد که موجود بودن و قیمت واحد کالا را اعلام میکند.
در بخش بعدی از طریق یونیتی به این تابع وصل شده و موجود را چک خواهیم کرد.
نحوه فراخوانی تابع از یونیتی
در این بخش قصد داریم تابع بالا را فراخوانی کنیم. برای این کار ابتدا دو کلاس در کد اپلکیشن خود برای ورودی و خروجی تابع check_availability تعریف میکنیم.
کلاس درخواست:
public class ProductCheckRequest {
public string Id { get; set; }
public int Count { get; set; }
public ProductCheckRequest(string id, int count) {
Id = id;
Count = count;
}
}
کلاس پاسخ:
public class ProductCheckResponse {
public bool Ok { get; set; }
public int price { get; set; }
}
حال به سادگی فراخوانی را انجام میدهیم:
// Create a request for TWO iphones, I am rich!
ProductCheckRequest requestForIphone = new ProductCheckRequest("iPhone 6 Plus 64GB", 2);
// Request server whether iphone is available or not
BacktoryCloudcode.RunInBackground<ProductCheckResponse>(
// Name of cloud code function
"check_availability",
// Request for iphone
requestForIphone,
// Callback to handle result
backtoryResponse => {
if (backtoryResponse.Successful) { // = context.succeed is called in server
// Extract ok and price from response
ProductCheckResponse result = backtoryResponse.Body;
bool ok = result.Ok;
long price = result.Price;
// Log the result
Debug.Log("Can I buy it?: " + ok +
", how much should I pay for every iphone? " + price);
}
}
);
در صورت بروز خطا مقدار backtoryResponse.Successful برابر false خواهد بود و عبارت backtoryResponse.code کد خطای اتفاق افتاده را شرح خواهد داد. مقدار این کد خطا یکی از مقادیر زیر است:
Tables | Description |
---|---|
200-OK | Function done successfully, aka context.succeed is called in server |
400-Bad Request | Something you sent to server is wrong |
401-Unauthorized | This function needs login before call |
402-Not Enough Credit | Your service is disabled in backtory, charge your account |
404-Not Found | Your initliazation key or function name is wrong |
420-Run Failed | Run failed, aka context.fail is call or execution timed-out |
500-Internal Server Error | Data access was unsuccessful |
503-Service Unavailable | Backtory is unavailable right now |
به این ترتیب به سادگی میتوانید یک منطق پیچیده را به سمت سرور انتقال دهید و به سادگی و تمیز آن را در سمت یونیتی فراخوانی کنید.
امنیت کاربران در رایانش
معمولا شما در منطق برنامه خود برای حفظ امنیت، نیاز دارید که کاربران را شناسایی کنید. برای مثال، فرض کنید در مثال فروشگاه آنلاین ما هر کاربر یک کیف پول مجازی دارد و قصد خرید کالا دارد. در فرآیند خرید در صورتی که کیف پول مجازی کاربر موجودی کافی داشته باشد، آن کالا خریداری شده و موجودی حساب کاربر شما کم خواهد شد. در این مثال شما در سمت کد رایانش باید بدانید تابع خرید (purchase) برای چه کاربری از مجموعه کاربران شما است. در صورتی که مثلا شناسه یا نام کاربری را از ورودی (requestBody) دریافت کنید، کد شما دچار ایراد امنیتی خواهد بود. زیرا هر کاربر دیگری میتواند در requestBody نامکاربری یک کاربر دیگر را وارد کند و عملا کاربر دوم، بدون هیچ اطلاعی، پول مجازی خود را از دست خواهد داد.
راهکار بکتوری استفاده از سرویس کاربران است. در صورتی که کاربر شما در اپلیکیشن ورود کرده باشد، SDK رایانش به طور اتوماتیک بدون آنکه نیاز باشد کاری کنید، اطلاعات کاربر را به صورت امن به دست کد رایانش شما در سرور میرساند. شما کافیست در کد سرور آیدی کاربر را دریافت کرده و چکهای منطقی لازم را انجام دهید. در این مدل هیچ کاربری نمیتواند خود را به جای کاربر دیگری قرار دهد و تقلب کند.
همانطور که گفتیم شما لازم به انجام هیچکاری در یونیتی نیستید و در سمت سرور نیز تکه کد زیر نامکاربری و شناسه کاربر را چاپ میکند:
// Body of code in server
exports.handler = function(requestBody, context) {
// Get userId from security context
var userId = context.getSecurityContext().userId;
// Get userName from security context
var userName = context.getSecurityContext().userName;
// print user info to response
context.succeed('request is originally sent from: ' + userName + ' with id: ' + userId);
};
به این ترتیب شما میتوانید همه منطق اپلیکیشن خود را آنلاین کنید و با استفاده از SDK رایانش به صورت کاملا امن آنها را فراخوانی کنید.