448
windows
快速搭建移动应用上传回调服务__移动应用端直传实践_最佳实践_对象存储 OSS-阿里云
背景
快速搭建移动应用直传服务介绍了如何在30分钟内中搭建一个基于OSS的移动应用数据直传服务。移动端开发场景流程图如下:
角色解析
- Android/iOS移动应用负责申请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移动应用。
可以参考Callback API文档。
上传回调的作用
通过上传回调可以让用户应用服务器知道当前上传文件的基本信息。
基本信息如下表。返回下述变量的一个或者多个,返回内容格式形式在Android/iOS上传时指定。
系统变量 | 含义 |
---|---|
bucket | 移动应用上传到哪个存储空间 |
object | 移动应用上传到OSS保存的文件名 |
etag | 该上传的文件的etag,即返回给用户的etag字段 |
size | 该上传的文件的大小 |
mimeType | 资源类型 |
imageInfo.height | 图片高度 |
imageInfo.width | 图片宽度 |
imageInfo.format | 图片格式,如jpg、png,只以识别图片 |
- 通过上传回调设定自定义参数,达到信息传递目的。
假如您是一个开发者,您想知道当前用户所使用的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如何处理应用服务器的返回内容
有两种情况:
- OSS将回调请求发送给应用服务器,但是应用服务器接收失败或者访问不通,OSS会返回给Android/iOS移动应用203的状态码,但是数据已经存放到OSS上了。
- 应用服务器接收到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
最后更新:2016-11-23 16:04:09
上一篇:
权限控制__移动应用端直传实践_最佳实践_对象存储 OSS-阿里云
下一篇:
Web端直传实践简介__Web端直传实践_最佳实践_对象存储 OSS-阿里云
什么是云服务器 ECS__产品简介_云服务器 ECS-阿里云
归档存储数据获取为什么需要等待__数据操作常见问题_产品使用问题_归档存储-阿里云
获取用户 Region 信息__用户管理相关接口_Open API_消息队列 MQ-阿里云
阿里云等4家企业违反《网络安全法》被责令整改
大数据开发套件__数加产品概览_数加平台介绍-阿里云
简讯:阿里云协助警方破获的一起国内规模最大黑客攻击案;等
弹性Web托管安装joomla,提示MB Language已被设置为默认。__产品相关问题_使用问题_弹性 Web 托管-阿里云
GenerateDataKey__API 参考_密钥管理服务-阿里云
修改RDS实例IP白名单__实例管理_API 参考_云数据库 RDS 版-阿里云
配置 Eclipse 开发环境__开发工具准备_开发者指南_企业级分布式应用服务 EDAS-阿里云
相关内容
常见错误说明__附录_大数据计算服务-阿里云
发送短信接口__API使用手册_短信服务-阿里云
接口文档__Android_安全组件教程_移动安全-阿里云
运营商错误码(联通)__常见问题_短信服务-阿里云
设置短信模板__使用手册_短信服务-阿里云
OSS 权限问题及排查__常见错误及排除_最佳实践_对象存储 OSS-阿里云
消息通知__操作指南_批量计算-阿里云
设备端快速接入(MQTT)__快速开始_阿里云物联网套件-阿里云
查询API调用流量数据__API管理相关接口_API_API 网关-阿里云
使用STS访问__JavaScript-SDK_SDK 参考_对象存储 OSS-阿里云