本文共 4439 字,大约阅读时间需要 14 分钟。
上一篇文章我们介绍了如何快速搭建移动应用
参考移动端开发场景流程图会负责申请STS凭证,然后使用从应用服务器取的凭证上传
负责给Android/iOS移动应用,生成STS凭证
OSS负责处理移动应用的数据请求
对于Android/iOS移动应来说,移动应用只需要执行操作1(申请STS凭证),就能调用多次5(使用该STS凭证上传数据到OSS)。这样就导致了应用服务器根本不知道用户都上传了哪些数据 ,如果那么作为该APP的开发者,就没法对应用上传数据进行管理。所以,有什么问题能让应用服务器感知到Android/iOS移动应用上传的数据呢?
通过使用OSS的上传回调服务,就能解决上述问题,如下图:
即OSS在收到Android/iOS移动的数据(第5步)和在返回用户上传结果(第6步)之间,触发一个上传回调工作。即第5.5步。先回调用户服务器,然后得到应用服务器返回的内容,将这个内容返回给Android/iOS移动应用。
可以参考一下
基本信息如下表:
系统变量 | 含义 |
---|---|
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在接收上传请求时,触发上传回调,那么移动应用必须在构造上传请求,必须把要两个内容指定到上传请求里面。这两个内容如下:
举一个示例。假如我的用户服务器上传回调地址是:。
我想获取手机上传的文件名字,文件的大小,并且我定义了photo变量是指手机型号。system是操作系统版本
OSSPutObjectRequest * request = [OSSPutObjectRequest new];request.bucketName = @"";request.objectKey = @" ";request.uploadingFileURL = [NSURL fileURLWithPath:@ "];// 设置回调参数request.callbackParam = @{ @"callbackUrl": @"http://abc.com/callback.php", @"callbackBody": @"filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}" };// 设置自定义变量request.callbackVar = @{ @"x:photo": @"iphone6s", @"x:system": @"ios9.1" };
PutObjectRequest put = new PutObjectRequest(testBucket, testObject, uploadFilePath);ObjectMetadata metadata = new ObjectMetadata();metadata.setContentType("application/octet-stream");put.setMetadata(metadata);put.setCallbackParam(new HashMap() { { put("callbackUrl", "http://abc.com/callback.php"); put("callbackBody", "filename=${object}&size=${size}&photo=${x:photo}&system=${x:system}"); }});put.setCallbackVars(new HashMap () { { put("x:photo", "IPOHE6S"); put("x:system", "YunOS5.0"); }});
本教程在后续内容,为大家准备了多个语言版本的示例, 下载及运行方法在本教程的最后。
应用服务器收到OSS的请求,抓包的请求如下(这个结果会根据不同人设定的不同URL和回调内容会有不同)
POST /index.html HTTP/1.0Host: 121.43.113.8Connection: closeContent-Length: 81Content-Type: application/x-www-form-urlencodedUser-Agent: ehttp-client/0.0.1authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2txA==x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==filename=test.txt&size=5&photo=iphone6s&system=ios9.1
可以参考一下
之所以要判断这个请求是来自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的返回内容,解析得到自己想要得到的数据。得到这个数据后,应用服务器可以把数据存放起来,方便后续管理。
有两种情况:
示例程序只是完成了如何检查应用服务器收到的签名, 用户要自行增加对应用服务器收到回调的内容的格式解析 。
Java版本:java -jar oss-callback-server-demo.jar 9000
(9000就运行的端口,可以自己指定)注意这个jar例子在java 1.7运行通过,如果有问题可以自己依据提供的代码进行修改。这是一个maven项目
PHP版本:
Python版本:
Ruby版本:
转载地址:http://bcqta.baihongyu.com/