对象存储服务API快速入门
什么是对象存储服务
对象存储服务(Object Storage Service,简称OSS)是一种基于云的对象存储服务,它允许用户将数据存储在分布式存储系统中,并提供API接口供用户进行数据的上传、下载、管理等功能,对象存储服务具有高可靠性、高可用性、高扩展性等特点,广泛应用于大数据、云计算、人工智能等领域。
对象存储服务API简介
对象存储服务API是对象存储服务提供的一套接口,用户可以通过这些接口实现数据的上传、下载、管理等功能,以下是一些常用的对象存储服务API:
创建存储空间(Bucket)
创建存储空间是使用对象存储服务的第一步,用户需要为存储空间指定名称、地域等信息。
上传对象(Object)
上传对象是将数据存储到存储空间的过程,用户可以通过API接口上传文件、图片等对象。
下载对象
下载对象是将存储空间中的对象下载到本地的过程,用户可以通过API接口实现对象的下载。
列举对象
列举对象是获取存储空间中所有对象的列表,用户可以通过API接口获取对象列表,以便进行后续操作。
删除对象
删除对象是将存储空间中的对象删除的过程,用户可以通过API接口实现对象的删除。
对象存储服务API快速入门指南
注册并登录对象存储服务
用户需要注册并登录对象存储服务,获取AccessKey和SecretKey。
创建存储空间
登录成功后,在控制台中创建存储空间,为存储空间指定名称、地域等信息。
上传对象
在控制台中,选择已创建的存储空间,上传文件或图片等对象。
下载对象
在控制台中,选择已上传的对象,点击下载按钮,将对象下载到本地。
列举对象
在控制台中,选择已创建的存储空间,查看对象列表。
删除对象
在控制台中,选择已上传的对象,点击删除按钮,将对象从存储空间中删除。
对象存储服务API常用参数说明
以下是对对象存储服务API常用参数的简要说明:
| 参数名称 | 参数说明 |
|---|---|
| 存储空间名称 | |
| 对象名称,即文件名 | |
| 对象键,用于唯一标识一个对象 | |
| AccessKeyId | 访问密钥ID,用于身份验证 |
| AccessKeySecret | 访问密钥密钥,用于身份验证 |
| 地域,用于指定存储空间所在的地域 | |
| 终端节点,用于指定API接口的访问地址 | |
| 请求方法,如GET、POST等 | |
| QueryString | 查询参数,用于传递额外的信息 |
| 请求头,用于传递自定义信息 |
问题:如何获取对象存储服务的AccessKey和SecretKey?
解答:用户可以在对象存储服务的控制台中,找到“密钥管理”模块,点击“创建密钥”,即可获取AccessKey和SecretKey。
问题:对象存储服务的API接口支持哪些编程语言?
解答:对象存储服务的API接口支持多种编程语言,如Java、Python、PHP、Go等,用户可以根据自己的需求选择合适的编程语言进行开发。
class="zdmcj_hr"/>
我心目中好的工程师是什么样的
“好工程师”:1.保持高标准,不要受制于破窗理论(broken windows theory)。 当你看到不靠谱的设计、糟糕的代码、过时的文档和测试用例的时候,不要想“既然别人的代码已经这样了,我的代码也可以随便一点啦。 ”2.主动解决问题。 当看到不靠谱的设计,糟糕的代码的时候,不要想“可能别人会来管这个事情” ,或者“我下个月发一个邮件让大家讨论一下”。 要主动地把问题给解决了。 3.经常给自己充电,身体训练是运动员生活的一部分,学习是软件工程师职业的伴侣。 每半年就要了解和学习一些新的相关技术。 通过定期分享(面对面的分享,写技术博客等)来确保自己真正掌握了新技术。 4. DRY (Dont Repeat Yourself)——别重复。 在一个系统中,每一个知识点都应该有一个无异议的、正规的表现形式。 5.消除不相关模块之间的影响,在设计模块的时候,要让它们目标明确并单一,能独立存在,没有不明确的外部依赖。 6. 通过快速原型来学习,快速原型的目的是学习,它的价值不在于代码,而在于你通过快速原型学到了什么。 7.设计要接近问题领域,在设计的时候,要接近你目标用户的语言和环境。 8.估计任务所花费的时间,避免意外。 在开始工作的时候,要做出时间和潜在影响的估计,并通告相关人士,避免最后关头意外发生。 9. 图形界面的工具有它的长处,但是不要忘了命令行工具也可以发挥很高的效率,特别是可以用脚本构建各种组合命令的时候。 10.有很多代码编辑器,请把其中一个用得非常熟练。 让编辑器可以实现自己的定制,可以用脚本驱动,用起来得心应手。 11.理解常用的设计模式,并知道择机而用。 设计模式不错,更重要的是知道它的目的是什么,什么时候用,什么时候不用。 12.代码版本管理工具是你代码的保障,重要的代码一定要有代码版本管理。 13.在debug的时候,不要惊慌,想想导致问题的原因可能在哪里。 一步一步地找到原因。 要在实践中运用工具,善于分析日志(log),从中找到bug。 同时,在自己的代码里面加 log.14.重要的接口要用形式化的“合同”来规定。 用文档和断言、自动化测试等工具来保证代码的确按照合同来做事,不多也不少。 使用断言 (assertion) 或者其他技术来验证代码中的假设,你认为不可能发生的事情在现实世界中往往会发生。 15.只在异常的情况下才使用异常(Exception), 不加判断地过多使用异常,会降低代码的效率和可维护性。 记住不要用异常来传递正常的信息。 16.善始善终。 如果某个函数申请了空间或其他资源,这个函数负责释放这些资源。 17. 当你的软件有多种技术结合在一起的时候,要采用松耦合的配置模式,而不是要把所有代码都集成到一起。 18.把常用模块的功能打造成独立的服务,通过良好的界面 (API) 来调用不同的服务。 19.在设计中考虑对并行的支持,这样你的API 设计会比较容易扩展。 20.在设计中把展现模块 (View) 和实体模块 (Model) 分开,这样你的设计会更有灵活性。 21.重视算法的效率,在开始写之前就要估计好算法的效率是哪一个数量级上的(big-O)。 22.在实际的运行场景中测试你的算法,不要停留在数学分析层面。 有时候一个小小的实际因素 (是否支持大小写敏感的排序,数据是否支持多语言)会导致算法效率的巨大变化。 23.经常重构代码,同时注意要解决问题的根源。 24. 在开始设计的时候就要考虑如何测试,如果代码出了问题,有log 来辅助debug 么? 尽早测试,经常测试,争取实现自动化测试,争取每一个构建的版本都能有某些自动测试。 25.代码生成工具可以生成一堆一堆的代码,在正式使用它们之前,要确保你能理解它们,并且必要的时候能debug 这些代码。 26.和一个实际的用户一起使用软件,获得第一手反馈。 27.在自动测试的时候,要有意引地入bug,来保证自动测试的确能捕获这些错误。 28.如果测试没有做完,那么开发也没有做完。 29.适当地追求代码覆盖率:每一行的代码都覆盖了,但是程序未必正确。 要确保程序覆盖了不同的程序状态和各种组合条件。 30. 如果团队成员碰到了一个有普遍意义的bug, 应该建立一个测试用例抓住以后将会出现的类似的bug。 31.测试:多走一步,多考虑一层。 如果程序运行了一星期不退出,如果用户的屏幕分辨率再提高一个档次,这个程序会出什么可能的错误?
如何学习MFC呢?
学习MFC的前提是掌握Windows编程,对Windows编程可以了解得不深但一定要掌握一些重要的概念。 这是因为VC++开发的目标是Windows程序,Windows编程是MFC编程的基础,MFC本质上是以面向对象的方式对WindowsAPI进行封装,如果不理解Windows编程的一些重要原理,比如API调用、消息处理机制等等,仅学习MFC必然只能理解得很片面,模棱两可,即使知道怎样做也不知道为什么这样做。 下面列出一些公认的经典书: The C Programming Language----------Brian ,Dennis “介绍标准C语言及其程序设计方法的权威性经典著作”--- C++ Primer----------Stanley B. Lippman“帮助全球无数程序员学会C++”--- Windows 程序设计(第5版)-----Charles Petzold“windows编程泰山北斗”--- Windows核心编程----------Jeffrey Richter“windows编程泰山北斗”--- Windows高级编程指南---------Jeffrey Richter“windows编程泰山北斗”--- 深入浅出MFC(第二版)-----“MFC四大天王”-------侯捷 MFC Windows程序设计(第2版)---MFC四大天王”---------Jeff Prosise Visual C++ 技术内幕(第4版)--MFC四大天王”--------David Kruglinski 深入解析MFC-------------MFC四大天王”-----------George Shepherd Visual C++ 技术内幕(第6版)-MFC四大天王”------------David Kruglinski 这些书籍包括其作者都是响当当的。 如果你不打算深入研究编程,而只是作为临时任务的工具的话,看一些应用方面,有很多例子代码的书就行,比如孙鑫的《VC++深入详解》,或者一些其他的大部头工具书。 如果想研究编程,深入理解MFC的工作机制,首先要精通Windows编程。 《Windows 程序设计》是较为基础的,实例代码很多,《Windows核心编程》和《Windows高级编程指南》就比较拔高了,涉及很多操作系统的知识。 掌握Windows编程后再研究MFC就轻松多了,它就是对WindowsAPI的封装,侯捷的《深入浅出MFC》讲得蛮细致深入。
如何使用WebSocket
引擎支持最新的WebSocket Version 13。 在C++中使用详细代码可参考引擎目录下的/samples/Cpp/TestCpp/Classes/ExtensionsTest/NetworkTest/文件。 头文件中的准备工作首先需要include WebSocket的头文件。 #include network/2d::network::WebSocket::Delegate定义了使用WebScocket需要监听的回调通知接口。 使用WebSocket的类,需要public继承这个Delegate。 class WebSocketTestLayer : public cocos2d::Layer, public cocos2d::network::WebSocket::Delegate并Override下面的4个接口:virtual void onOpen(cocos2d::network::WebSocket* ws);virtual void onMessage(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::Data& data);virtual void onClose(cocos2d::network::WebSocket* ws);virtual void onError(cocos2d::network::WebSocket* ws, const cocos2d::network::WebSocket::ErrorCode& error);后面我们再详细介绍每个回调接口的含义。 新建WebSocket并初始化 提供了一个专门用来测试WebSocket的服务器ws://。 测试代码以链接这个服务器为例,展示如何在Cocos2d-x中使用WebSocket。 新建一个WebSocket:cocos2d::network::WebSocket* _wsiSendText = new network::WebSocket();init第一个参数是delegate,设置为this,第二个参数是服务器地址。 URL中的ws://标识是WebSocket协议,加密的WebSocket为wss://._wsiSendText->init(*this, ws://)WebSocket消息监听在调用send发送消息之前,先来看下4个消息回调。 onOpeninit会触发WebSocket链接服务器,如果成功,WebSocket就会调用onOpen,告诉调用者,客户端到服务器的通讯链路已经成功建立,可以收发消息了。 void WebSocketTestLayer::onOpen(network::WebSocket* ws){if (ws == _wsiSendText){_sendTextStatus->setString(Send Text WS was opened.);}}onMessagenetwork::WebSocket::Data对象存储客户端接收到的数据, isBinary属性用来判断数据是二进制还是文本,len说明数据长度,bytes指向数据。 void WebSocketTestLayer::onMessage(network::WebSocket* ws, const network::WebSocket::Data& data){if (!){_sendTextTimes++;char times[100] = {0};sprintf(times, %d, _sendTextTimes);std::string textStr = std::string(response text msg: )++, +times;log(%s, textStr.c_str());_sendTextStatus->setString(textStr.c_str());}}onClose不管是服务器主动还是被动关闭了WebSocket,客户端将收到这个请求后,需要释放WebSocket内存,并养成良好的习惯:置空指针。 void WebSocketTestLayer::onClose(network::WebSocket* ws){if (ws == _wsiSendText){_wsiSendText = NULL;}CC_SAFE_DELETE(ws);}onError客户端发送的请求,如果发生错误,就会收到onError消息,游戏针对不同的错误码,做出相应的处理。 void WebSocketTestLayer::onError(network::WebSocket* ws, const network::WebSocket::ErrorCode& error){log(Error was fired, error code: %d, error);if (ws == _wsiSendText){char buf[100] = {0};sprintf(buf, an error was fired, code: %d, error);_sendTextStatus->setString(buf);}}send消息到服务器在init之后,我们就可以调用send接口,往服务器发送数据请求。 send有文本和二进制两中模式。 发送文本_wsiSendText->send(Hello WebSocket, Im a text message.);发送二进制数据(多了一个len参数)_wsiSendBinary->send((unsigned char*)buf, sizeof(buf));主动关闭WebSocket这是让整个流程变得完整的关键步骤, 当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接。 close会触发onClose消息,而后onClose里面,我们释放内存。 _wsiSendText->close();在Lua中使用详细代码可参考引擎目录下的/samples/Lua/TestLua/Resources/luaScript/ExtensionTest/文件。 创建WebSocket对象脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。 wsSendText = WebSocket:create(ws://)定义并注册消息回调函数回调函数是普通的Lua function,4个消息回调和c++的用途一致,参考上面的说明。 local function wsSendTextOpen(strData)sendTextStatus:setString(Send Text WS was opened.)endlocal function wsSendTextMessage(strData)receiveTextTimes= receiveTextTimes + 1local strInfo= response text msg: .., :setString(strInfo)endlocal function wsSendTextClose(strData)print(_wsiSendText websocket instance closed.)sendTextStatus = nilwsSendText = nilendlocal function wsSendTextError(strData)print(sendText Error was fired)endLua的消息注册不同于C++的继承 & Override,有单独的接口registerScriptHandler。 registerScriptHandler第一个参数是回调函数名,第二个参数是回调类型。 每一个WebSocket实例都需要绑定一次。 if nil ~= wsSendText thenwsSendText:registerScriptHandler(wsSendTextOpen,_OPEN)wsSendText:registerScriptHandler(wsSendTextMessage,_MESSAGE)wsSendText:registerScriptHandler(wsSendTextClose,_CLOSE)wsSendText:registerScriptHandler(wsSendTextError,_ERROR)endsend消息Lua中发送不区分文本或二进制模式,均使用下面的接口。 wsSendText:sendString(Hello WebSocket中文, Im a text message.)主动关闭WebSocket当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。 close会触发_CLOSE消息。 wsSendText:close()在JSB中使用详细代码可参考引擎目录下的/samples/Javascript/Shared/tests/ExtensionsTest/NetworkTest/文件。 创建WebSocket对象脚本接口相对C++要简单很多,没有头文件,创建WebSocket对象使用下面的一行代码搞定。 参数是服务器地址。 this._wsiSendText = new WebSocket(ws://);设置消息回调函数JSB中的回调函数是WebSocket实例的属性,使用匿名函数直接赋值给对应属性。 可以看出JS语言的特性,让绑定回调函数更加优美。 四个回调的含义,参考上面c++的描述。 this._ = function(evt) {self._(Send Text WS was opened.);};this._ = function(evt) {self._sendTextTimes++;var textStr = response text msg: ++, +self._sendTextTimes;(textStr);self._(textStr);};this._ = function(evt) {(sendText Error was fired);};this._ = function(evt) {(_wsiSendText websocket instance closed.);self._wsiSendText = null;};send消息发送文本,无需转换,代码如下:this._(Hello WebSocket中文, Im a text message.);发送二进制,测试代码中,使用_stringConvertToArray函数来转换string为二进制数据,模拟二进制的发送。 new Uint16Array创建一个16位无符号整数值的类型化数组,内容将初始化为0。 然后,循环读取字符串的每一个字符的Unicode编码,并存入Uint16Array,最终得到一个二进制对象。 _stringConvertToArray:function (strData) {if (!strData)returnnull;var arrData = new Uint16Array();for (var i = 0; i < ; i++) {arrData[i] = (i);}return arrData;},send二进制接口和send文本没有区别,区别在于传入的对象,JS内部自己知道对象是文本还是二进制数据,然后做不同的处理。 var buf = Hello WebSocket中文,\0 Im\0 a\0 binary\0 message\0.;var binary = this._stringConvertToArray(buf);this._();主动关闭WebSocket当某个WebSocket的通讯不再使用的时候,我们必须手动关闭这个WebSocket与服务器的连接,以释放服务器和客户端的资源。 close会触发onclose消息。 onExit: function() {if (this._wsiSendText)this._();}














发表评论