OSS移動開發實戰2 (30分鍾快速搭建移動應用上傳回調服務)
30分鍾快速搭建移動應用上傳回調服務
背景
上一篇文章我們介紹了如何快速搭建移動應用
參考移動端開發場景流程圖
點擊查看
上述圖中Android/iOS移動應用的職責
會負責申請STS憑證,然後使用從應用服務器取的憑證上傳
上述圖中應用服務器的職責
負責給Android/iOS移動應用,生成STS憑證
上述圖中OSS的職責
OSS負責處理移動應用的數據請求
問題
對於Android/iOS移動應來說,移動應用隻需要執行操作1(申請STS憑證),就能調用多次5(使用該STS憑證上傳數據到OSS)。這樣就導致了應用服務器根本不知道用戶都上傳了哪些數據 ,如果那麼作為該APP的開發者,就沒法對應用上傳數據進行管理。所以,有什麼問題能讓應用服務器感知到Android/iOS移動應用上傳的數據呢?
答案
通過使用OSS的上傳回調服務,就能解決上述問題,如下圖:
即OSS在收到Android/iOS移動的數據(第5步)和在返回用戶上傳結果(第6步)之間,觸發一個上傳回調工作。即第5.5步。先回調用戶服務器,然後得到應用服務器返回的內容,將這個內容返回給Android/iOS移動應用。
可以參考一下Callback API文檔
上傳回調的作用
通過上傳回調可以讓用戶應用服務器知道當前上傳文件的基本信息
基本信息如下表:
係統變量 | 含義 |
---|---|
bucket | 移動應用上傳到哪個存儲空間 |
object | 移動應用上傳到OSS保存的文件名 |
etag | 該上傳的文件的etag,即返回給用戶的etag字段 |
size | 該上傳的文件的大小 |
mimeType | 資源類型 |
imageInfo.height | 圖片高度 |
imageInfo.width | 圖片寬度 |
imageInfo.format | 圖片格式,如jpg、png,隻以識別圖片 |
返回上述變量的一個或者多個,返回內容格式形式在Android/iOS上傳時指定
通過上傳回調設定自定義參數,達到信息傳遞目的
如:假如我是一個開發者,我想知道當前用戶所使用的APP版本、當前用戶所在的操作係統版本、用戶的GPS信息、用戶的手機型號。那麼我可以在Android/iOS端上傳文件時,指定上述自定義參數 ,如x:version指定APP版本,x:system指定操作係統版本,x:gps指定GPS信息,x:phone指定手機型號
這些值,會在Android/iOS移動應用上傳到OSS時,附帶上。然後OSS,會把這些值,放到CallbackBody裏麵,一起發給應用服務器。這樣應用服務器就能收到這些信息,達到信息傳遞的目的。
移動應用端怎麼樣設定上傳回調?
要讓OSS在接收上傳請求時,觸發上傳回調,那麼移動應用必須在構造上傳請求,必須把要兩個內容指定到上傳請求裏麵。這兩個內容如下:
- 要回調到哪個服務器callbackUrl,如上一點提到的https://abc.com/callback.php,注意這個地址必須是公網能夠訪問的
-
上傳回調給應用服務器的內容callbackBody。可以是上述OSS返回應用服務器係統變量的一個或者多個。
舉一個示例。假如我的用戶服務器上傳回調地址是:https://abc.com/callback.php。
我想獲取手機上傳的文件名字,文件的大小,並且我定義了photo變量是指手機型號。system是操作係統版本
iOS指定上傳回調示例
OSSPutObjectRequest * request = [OSSPutObjectRequest new];
request.bucketName = @"<bucketName>";
request.objectKey = @"<objectKey>";
request.uploadingFileURL = [NSURL fileURLWithPath:@<filepath>"];
// 設置回調參數
request.callbackParam = @{
@"callbackUrl": @"https://abc.com/callback.php",
@"callbackBody": @"filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}"
};
// 設置自定義變量
request.callbackVar = @{
@"x:photo": @"iphone6s",
@"x:system": @"ios9.1"
};
Android指定上傳回調示例
PutObjectRequest put = new PutObjectRequest(testBucket, testObject, uploadFilePath);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("application/octet-stream");
put.setMetadata(metadata);
put.setCallbackParam(new HashMap<String, String>() {
{
put("callbackUrl", "https://abc.com/callback.php");
put("callbackBody", "filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}");
}
});
put.setCallbackVars(new HashMap<String, String>() {
{
put("x:photo", "IPOHE6S");
put("x:system", "YunOS5.0");
}
});
對於上傳回調,應用服務器應該做些什麼?
- 你必須要有部署一個可以接收POST請求的服務,這個服務必須有公網地址如www.abc.com/callback.php(或者外網IP也可以),不然OSS沒有辦法訪問到這個地址。
- 你要給OSS正確的返回,返回格式必須是JSON格式,內容自定義。因為OSS會把應用服務器返回的內容,原封不動地返回給Android/iOS移動應用。(切記,返回給OSS的Response Header一定要加上Content-Length這個頭部)
本教程在後續內容,為大家準備了多個語言版本的示例, 下載及運行方法在本教程的最後。
應用服務器收到的回調請求是怎麼樣
應用服務器收到OSS的請求,抓包的請求如下(這個結果會根據不同人設定的不同URL和回調內容會有不同)
POST /index.html HTTP/1.0
Host: 121.43.113.8
Connection: close
Content-Length: 81
Content-Type: application/x-www-form-urlencoded
User-Agent: ehttp-client/0.0.1
authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2txA==
x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==
filename=test.txt&size=5&photo=iphone6s&system=ios9.1
可以參考一下Callback API文檔
應用服務器怎麼樣判斷這個請求是來自OSS
之所以要判斷這個請求是來自OSS,是因為如果你的回調服務器被人惡意攻擊了,別人惡意回調你的應用服務器,導致應用服務器收到一些非法的請求,影響正常邏輯。
判斷的方法主要是利用OSS給應用服務器返回的頭部內容中, x-oss-pub-key-url,authorization這兩個參數進行RSA校驗。隻有通過RSA校驗的請求,才能說明這個請求是來自OSS,本教程提供的示例程序都有實現的示例,大家可以參考。
應用服務器收到這個回調做什麼
應用服務器在校驗這個請求是來自OSS後(這一步不是必要的),因為Android/iOS應用在上傳數據時,指定了回調給應用服務器的內容格式,如
filename=test.txt&size=5&photo=iphone6s&system=ios9.1
應用服務器就可以根據OSS的返回內容,解析得到自己想要得到的數據。得到這個數據後,應用服務器可以把數據存放起來,方便後續管理。
應用服務器收到這個回調要怎麼樣返回給OSS
- 返回狀態碼是200;
- 返回必須是json格式的內容;
- 並且返回的頭部必須帶有Content-Length這個頭部
OSS怎麼樣處理應用服務器的返回內容
有兩種情況:
1. OSS將回調請求發送給應用服務器,但是應用服務器接收失敗或者訪問不通,OSS會返回給Android/iOS移動應用203的狀態碼,但是數據已經存放到OSS上了。
2. 應用服務器,接收到OSS的回調請求,並且正確返回了,OSS會返回給Android/iOS移動應用狀態碼是200, 並把應用服務器給OSS的內容,原封不動地返回給Android/iOS移動應用.
上傳回調服務器示例程序下載
示例程序隻是完成了如何檢查應用服務器收到的簽名, 用戶要自行增加對應用服務器收到回調的內容的格式解析 。
Java版本:
- 下載地址:點擊這裏
- 運行方法,解壓包運行
java -jar oss-callback-server-demo.jar 9000
(9000就運行的端口,可以自己指定) > 注意這個jar例子在java 1.7運行通過,如果有問題可以自己依據提供的代碼進行修改。這是一個maven項目
PHP版本:
- 下載地址:點擊這裏
- 運行方法:部署到Apache環境下,因為PHP本身語言的特點,取一些數據頭部會依賴於環境。所以可以參考例子基於自己所在環境進行修改
Python版本:
- 下載地址:點擊這裏
- 運行方法:解壓包直接運行python callback_app_server.py即可,程序自實現了一個簡單的http server,運行該程序可能需要安裝rsa的依賴。
Ruby版本:
- 下載地址:點擊這裏
- 運行方法: ruby aliyun_oss_callback_server.rb
最後更新:2017-04-01 13:39:21