单链接限速(Go SDK)
功能说明
客户端访问OBS对象时占用大量带宽,会影响其他应用的正常使用,可以通过使用单链接限速功能解决该问题。
目前仅支持GetObject方法。
接口约束
- OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点。
方法定义
func (obsClient ObsClient) GetObject(input *GetObjectInput, obs.WithTrafficLimitHeader(traffic *int64)) (output *GetObjectOutput, err error)
请求参数说明
| 参数名称 | 参数类型 | 是否必选 | 描述 |
|---|---|---|---|
| input | 必选 | 参数解释: 获取对象请求参数,详见GetObjectInput。 | |
| traffic | *int64 | 必选 | 参数解释: 对下载对象请求的带宽限制。 取值范围: 819200 ~ 838860800,单位 bit/s。 默认取值: 无 |
| 参数名称 | 参数类型 | 是否必选 | 描述 |
|---|---|---|---|
| Bucket | string | 必选 | 参数解释: 桶名。 约束限制:
默认取值: 无 |
| Key | string | 必选 | 参数解释: 对象名。对象名是对象在存储桶中的唯一标识。对象名是对象在桶中的完整路径,路径中不包含桶名。 例如,您对象的访问地址为examplebucket.obs.cn-north-4. myhuaweicloud.com/folder/test.txt 中,对象名为folder/test.txt。 取值范围: 长度大于0且不超过1024的字符串。 默认取值: 无 |
| ResponseCacheControl | string | 可选 | 参数解释: 指定OBS返回请求中Cache-Control头的值。指定Object被下载时的网页的缓存行为。 默认取值: 无 |
| ResponseContentDisposition | string | 可选 | 参数解释: 指定OBS返回请求中Content-Disposition头的值。指定Object被下载时的名称。 默认取值: 无 |
| ResponseContentEncoding | string | 可选 | 参数解释: 指定OBS返回请求中Content-Encoding头的值。指定Object被下载时的内容编码格式。 默认取值: 无 |
| ResponseContentLanguage | string | 可选 | 参数解释: 指定OBS返回请求中Content-Language头的值。指定Object被下载时的内容语言格式。 默认取值: 无 |
| ResponseContentType | string | 可选 | 参数解释: 指定OBS返回请求中Content-Type头的值。指定Object文件类型。 默认取值: 无 |
| ResponseExpires | string | 可选 | 参数解释: 指定OBS返回请求中Expires头的值。指定Object被下载时的网页的缓存过期时间。 默认取值: 无 |
| VersionId | string | 可选 | 参数解释: 对象的版本号,用于获取指定版本号的对象。例如:G001117FCE89978B0000401205D5DC9。 取值范围: 长度为32的字符串。 默认取值: 无,如果不设置则默认获取最新版本的对象。 |
| ImageProcess | string | 可选 | 参数解释: 图片处理参数,描述针对对象的图片处理命令或处理样式。例如如果想表示对图片依次进行缩放、旋转,取值:image/resize,m_fixed,w_100,h_100/rotate,90。 取值范围: 命令方式:image/命令参数 样式方式:style/样式名称 详细参数说明参见处理图片。 默认取值: 如果不输入处理命令,将返回原图。 |
| RangeStart | int64 | 可选 | 参数解释: 指定下载对象的起始位置。 取值范围: 0~对象长度,单位:字节。 默认取值: 0,即从对象的第一个字节开始下载。 |
| RangeEnd | int64 | 可选 | 参数解释: 指定下载对象的结束位置。 取值范围:
默认取值: 无 |
| IfMatch | string | 可选 | 参数解释: 指定一个预设的Etag值,如果下载对象的ETag值与该参数值相同,则返回对象内容,否则返回错误。 取值范围: 长度为16字节的字符串。 默认取值: 无 |
| IfNoneMatch | string | 可选 | 参数解释: 指定一个预设的ETag值,如果下载对象的ETag值与该参数值不相同,则返回对象内容,否则返回错误。 取值范围: 长度为32的字符串。 默认取值: 无 |
| IfModifiedSince | time.Time | 可选 | 参数解释: 如果对象在指定的时间后有修改,则返回对象内容,否则返回错误。 约束限制: 日期格式必须为ISO8601的格式。 例如:2018-01-01T00:00:00.000Z,表示如果最后修改时间晚于2018-01-01T00:00:00.000Z则返回对象内容,否则返回错误。 代码示例:time.Now().Add(time.Duration(24) * time.Hour)。 默认取值: 无 |
| IfUnmodifiedSince | time.Time | 可选 | 参数解释: 如果对象在指定的时间后没有修改,则返回对象内容,否则返回错误。 约束限制: 日期格式必须为ISO8601的格式。 例如:2018-01-01T00:00:00.000Z,表示如果最后修改时间早于2018-01-01T00:00:00.000Z则返回对象内容,否则返回错误。 代码示例:time.Now().Add(time.Duration(24) * time.Hour)。 默认取值: 无 |
| SseHeader | 可选 | 参数解释: 服务端解密头信息,详见SseCHeader。 约束限制: 如果客户端的对象上传时,使用了客户提供的加密密钥进行服务端加密,当下载对象时,同样也必须在消息中提供密钥。 |
| 参数名称 | 参数类型 | 是否必选 | 描述 |
|---|---|---|---|
| Encryption | string | 作为请求参数时必选 | 参数解释: 表示服务端加密是SSE-C方式。对象使用SSE-C加密方式。 取值范围: 可选值:AES256,即选择SSE-C方式加密对象。 默认取值: 无 |
| Key | string | 作为请求参数时必选 | 参数解释: SSE-C方式下加密使用的密钥,该密钥用于加密对象。 约束限制: 该头域由256bit的密钥经过Base64编码得到,示例:K7QkYpBkM5+hca27fsNkUnNVaobncnLht/rCB2o/9Cw= 默认取值: 无 |
| KeyMD5 | string | 作为请求参数时可选 | 参数解释: SSE-C方式下加密使用密钥的MD5值,该值用于验证密钥传输过程中是否出错。 约束限制: 由密钥值经过MD5加密再经过Base64编码后得到,示例:4XvB3tbNTN+tIEVa0/fGaQ== 默认取值: 无 |
返回结果
| 参数名 | 类型 | 描述 |
|---|---|---|
| output | 参数解释: 接口返回信息,详见GetObjectOutput。 | |
| err | error | 参数解释: 接口返回错误信息。 |
| 字段名 | 类型 | 说明 |
|---|---|---|
| StatusCode | int | 参数解释: HTTP状态码。 取值范围: 状态码是一组从2xx(成功)到4xx或5xx(错误)的数字代码,状态码表示了请求响应的状态。完整的状态码列表请参见状态码。 默认取值: 无 |
| RequestId | string | 参数解释: OBS服务端返回的请求ID。 默认取值: 无 |
| ResponseHeaders | map[string][]string | 参数解释: HTTP响应头信息。 默认取值: 无 |
| Body | io.ReadCloser | 参数解释: 下载对象的数据流。 默认取值: 无 |
| StorageClass | 参数解释: 对象的存储类型。 取值范围: 存储类型取值范围详见StorageClassType。 默认取值: 无 | |
| AllowOrigin | string | 参数解释: 如果请求中的Origin满足桶的CORS规则,则返回CORS规则中的AllowedOrigin。AllowedOrigin指定允许的跨域请求的来源,即允许来自该域名下的请求访问该对象。 约束限制: 表示域名的字符串,每个匹配规则允许使用最多一个“*”通配符。例如:https://*.vbs.example.com。 默认取值: 无 |
| AllowHeader | string | 参数解释: 如果请求的RequestHeader满足桶的CORS规则,则返回CORS规则中的AllowedHeader。AllowedHeader是指允许的跨域请求的头域。只有匹配上允许的头域中的配置,才被视为是合法的CORS请求。 约束限制: 最多可填写一个“*”通配符,不支持&、:、<、空格以及中文字符。 默认取值: 无 |
| AllowMethod | string | 参数解释: 桶CORS规则中的AllowedMethod。AllowedMethod指允许的跨域请求HTTP方法,即桶和对象的几种操作类型。 取值范围: 支持以下HTTP方法:
默认取值: 无 |
| ExposeHeader | string | 参数解释: 桶CORS规则中的ExposeHeader。ExposeHeader是指CORS规则允许响应中可返回的附加头域,给客户端提供额外的信息。默认情况下浏览器只能访问以下头域:Content-Length、Content-Type,如果需要访问其他头域,需要在附加头域中配置。 约束限制: 不支持*、&、:、<、空格以及中文字符。 默认取值: 无 |
| MaxAgeSeconds | int | 参数解释: 桶CORS规则中的MaxAgeSeconds。MaxAgeSeconds指请求来源的客户端可以对跨域请求返回结果的缓存时间。 约束限制: 每个CORSRule可以包含至多一个MaxAgeSeconds。 取值范围: 0~(231-1),单位:秒。 默认取值: 100,单位:秒。 |
| ContentLength | int64 | 参数解释: 对象数据的长度。 取值范围: 0~(263-1),单位:字节。 默认取值: 无 |
| CacheControl | string | 参数解释: 响应中的Cache-Control头。指定对象被下载时的网页的缓存行为。 默认取值: 无 |
| ContentDisposition | string | 参数解释: 响应中的Content-Disposition头。 默认取值: 无 |
| ContentEncoding | string | 参数解释: 响应中的Content-Encoding头。 默认取值: 无 |
| ContentLanguage | string | 参数解释: 响应中的Content-Language头。 默认取值: 无。 |
| ContentType | string | 参数解释: 对象的文件类型(MIME类型)。Content-Type(MIME)用于标识发送或接收数据的类型,浏览器根据该参数来决定数据的打开方式。 取值范围: 常见的Content-Type(MIME)列表参见如何理解Content-Type(MIME)? 默认取值: 如果您在上传Object时未指定Content-Type,SDK会根据指定Object名称的后缀名来判定文件类型并自动填充Content-Type。 |
| Expires | string | 参数解释: 响应中的Expires头。 默认取值: 无 |
| LastModified | time.Time | 参数解释: 对象的最近一次修改时间。 约束限制: 日期格式必须为ISO8601的格式。 例如:2018-01-01T00:00:00.000Z,表示最后一次修改时间为2018-01-01T00:00:00.000Z。 默认取值: 无 |
| ETag | string | 参数解释: 对象的base64编码的128位MD5摘要。ETag是对象内容的唯一标识,可以通过该值识别对象内容是否有变化。比如上传对象时ETag为A,下载对象时ETag为B,则说明对象内容发生了变化。ETag只反映变化的内容,而不是其元数据。上传的对象或拷贝操作创建的对象,都有唯一的ETag。 约束限制: 当对象是服务端加密的对象时,ETag值不是对象的MD5值。 取值范围: 长度为32的字符串。 默认取值: 无 |
| VersionId | string | 参数解释: 对象的版本号。 取值范围: 长度为32的字符串。 默认取值: 无 |
| Restore | string | 参数解释: 标识对象的恢复状态。对象为归档存储或深度归档存储类型,并且处于正在恢复或已经恢复时,会返回此头域。 示例:正在恢复ongoing-request="true";已恢复 ongoing-request="false", expiry-date="Wed, 7 Nov 2012 00:00:00 GMT"。其中expiry-date表示对象恢复后的失效时间。 约束限制: 归档或深度归档存储类型对象的恢复状态,如果对象不为归档或深度归档存储类型,则该值为空。 默认取值: 无 |
| Expiration | string | 参数解释: 对象的详细过期信息。比如:"expiry-date=\"Mon, 11 Sep 2023 00:00:00 GMT\"" 默认取值: 无 |
| SseHeader | 或 | 参数解释: 服务端加密头信息,选择SSE-C加密方式,则详见SseCHeader,选择SSE-KMS加密方式,则详见SseKmsHeader。 |
| WebsiteRedirectLocation | string | 参数解释: 当桶设置了Website配置,可以将获取这个对象的请求重定向到桶内另一个对象或一个外部的URL,该参数指明对象的重定向地址。 例如,重定向请求到桶内另一对象: WebsiteRedirectLocation:/anotherPage.html 或重定向请求到一个外部URL: WebsiteRedirectLocation:http://www.example.com/ OBS将这个值从头域中取出,保存在对象的元数据“WebsiteRedirectLocation”中。 约束限制:
默认取值: 无 |
| Metadata | map[string]string | 参数解释: 对象自定义元数据。OBS支持用户使用以“x-obs-meta-”开头的消息头来加入自定义的元数据,以便对对象进行自定义管理。当用户获取此对象或查询此对象元数据时,加入的自定义元数据将会在返回的消息头中出现。 约束限制:
默认取值: 无 |
| 常量名 | 原始值 | 说明 |
|---|---|---|
| StorageClassStandard | STANDARD | 标准存储。 标准存储拥有低访问时延和较高的吞吐量,适用于有大量热点对象(平均一个月多次)或小对象(<1MB),且需要频繁访问数据的业务场景。 |
| StorageClassWarm | WARM | 低频访问存储。 低频访问存储适用于不频繁访问(平均一年少于12次)但在需要时也要求能够快速访问数据的业务场景。 |
| StorageClassCold | COLD | 归档存储。 归档存储适用于很少访问(平均一年访问一次)数据的业务场景。 |
| StorageClassDeepArchive | DEEP_ARCHIVE | 深度归档存储 适用于长期不访问(平均几年访问一次)数据的业务场景。 |
| StorageClassINTELLIGENTTIERING | INTELLIGENT_TIERING | 智能分级存储 通过访问模式的变化,自动将对象数据转移到更经济的访问层来优化存储成本,因而适用于数据不断变化或数据不可预测的业务场景。 |
| 参数名称 | 参数类型 | 是否必选 | 描述 |
|---|---|---|---|
| Encryption | string | 作为请求参数时必选 | 参数解释: 表示服务端加密是SSE-C方式。对象使用SSE-C加密方式。 取值范围: 可选值:AES256,即选择SSE-C方式加密对象。 默认取值: 无 |
| Key | string | 作为请求参数时必选 | 参数解释: SSE-C方式下加密使用的密钥,该密钥用于加密对象。 约束限制: 该头域由256bit的密钥经过Base64编码得到,示例:K7QkYpBkM5+hca27fsNkUnNVaobncnLht/rCB2o/9Cw= 默认取值: 无 |
| KeyMD5 | string | 作为请求参数时可选 | 参数解释: SSE-C方式下加密使用密钥的MD5值,该值用于验证密钥传输过程中是否出错。 约束限制: 由密钥值经过MD5加密再经过Base64编码后得到,示例:4XvB3tbNTN+tIEVa0/fGaQ== 默认取值: 无 |
| 参数名称 | 参数类型 | 是否必选 | 描述 |
|---|---|---|---|
| Encryption | string | 作为请求参数时必选 | 参数解释: 表示服务端加密是SSE-KMS方式。对象使用SSE-KMS方式加密。 取值范围: 可选值:kms,即选择SSE-KMS方式加密对象。 默认取值: 无 |
| Key | string | 作为请求参数时可选 | 参数解释: SSE-KMS加密方式下使用的KMS主密钥的ID值。 取值范围: 有效值支持两种格式:
其中:
默认取值:
|
| ProjectID | string | 作为请求参数时可选 | 参数解释: SSE-KMS加密方式下KMS主密钥所属的项目ID(非企业项目ID)。 约束限制: 无 取值范围: 与Key指定的密钥ID相匹配的项目ID(非企业项目ID)。 默认取值: 无 |
代码示例
本示例用于限速下载examplebucket桶中的example/objectname对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | package main import ( "fmt" "os" obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs" ) func main() { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html ak := os.Getenv("AccessKeyID") sk := os.Getenv("SecretAccessKey") // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。 // securityToken := os.Getenv("SecurityToken") // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。 endPoint := "https://obs.cn-north-4.myhuaweicloud.com" // 创建obsClient实例 // 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过obs.WithSecurityToken方法指定securityToken值。 obsClient, err := obs.New(ak, sk, endPoint/*, obs.WithSecurityToken(securityToken)*/) if err != nil { fmt.Printf("Create obsClient error, errMsg: %s", err.Error()) } input := &obs.GetObjectInput{} // 指定存储桶名称 input.Bucket = "examplebucket" // 指定下载对象,此处以 example/objectname 为例。 input.Key = "example/objectname" // 定义下载限速参数,类型为数字,单位为bit/s。此处以 819200 为例, 表示此请求限速 100KB/s。 var traffic int64 = 819200 // 限速下载对象,使用obs.WithTrafficLimitHeader限速 output, err := obsClient.GetObject(input, obs.WithTrafficLimitHeader(traffic)) if err == nil { fmt.Printf("Get object(%s) under the bucket(%s) successful!\n", input.Key, input.Bucket) fmt.Printf("StorageClass:%s, ETag:%s, ContentType:%s, ContentLength:%d, LastModified:%s\n", output.StorageClass, output.ETag, output.ContentType, output.ContentLength, output.LastModified) // output.Body 在使用完毕后必须关闭,否则会造成连接泄漏。 defer output.Body.Close() // 读取对象内容 p := make([]byte, 1024) var readErr error var readCount int for { readCount, readErr = output.Body.Read(p) if readCount > 0 { fmt.Printf("%s", p[:readCount]) } if readErr != nil { break } } return } fmt.Printf("List objects under the bucket(%s) fail!\n", input.Bucket) if obsError, ok := err.(obs.ObsError); ok { fmt.Println("An ObsError was found, which means your request sent to OBS was rejected with an error response.") fmt.Println(obsError.Error()) } else { fmt.Println("An Exception was found, which means the client encountered an internal problem when attempting to communicate with OBS, for example, the client was unable to access the network.") fmt.Println(err) } } |
本示例用于生成单链接限速场景的下载对象的带授权信息的URL,并下载对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | package main import ( "fmt" "net/http" "os" obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs" ) func main() { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html ak := os.Getenv("AccessKeyID") sk := os.Getenv("SecretAccessKey") // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。 // securityToken := os.Getenv("SecurityToken") // endpoint填写Bucket对应的Endpoint, 这里以华北-北京四为例,其他地区请按实际情况填写。 endPoint := "https://obs.cn-north-4.myhuaweicloud.com" // 创建obsClient实例 // 如果使用临时AKSK和SecurityToken访问OBS,需要在创建实例时通过obs.WithSecurityToken方法指定securityToken值。 obsClient, err := obs.New(ak, sk, endPoint/*, obs.WithSecurityToken(securityToken)*/) if err != nil { fmt.Printf("Create obsClient error, errMsg: %s", err.Error()) } getObjectInput := &obs.CreateSignedUrlInput{} getObjectInput.Method = obs.HttpMethodGet getObjectInput.Bucket = "examplebucket" getObjectInput.Key = "example/objectname" getObjectInput.Expires = 3600 // 添加单链接限速的自定义header getObjectInput.Headers = map[string]string{ "x-obs-traffic-limit": "819200", } // 生成下载对象的带授权信息的URL getObjectOutput, err := obsClient.CreateSignedUrl(getObjectInput) if err != nil { fmt.Println(err) return } fmt.Printf("SignedUrl:%s\n", getObjectOutput.SignedUrl) fmt.Printf("ActualSignedRequestHeaders:%v\n", getObjectOutput.ActualSignedRequestHeaders) // 调用授权URl req, err := http.NewRequest("GET", getObjectOutput.SignedUrl, nil) req.Header = getObjectOutput.ActualSignedRequestHeaders if err != nil { fmt.Printf("Create request error, errMsg: %s", err.Error()) return } response, err := http.DefaultClient.Do(req) if err == nil { fmt.Printf("Use signed-url successful!\n") fmt.Printf("Status:%s,Etag:%s\n", response.Status, response.Header.Get("Etag")) p := make([]byte, 1024) var readErr error var readCount int // 读取对象内容 for { readCount, readErr = response.Body.Read(p) if readCount > 0 { fmt.Printf("%s", p[:readCount]) } if readErr != nil { break } } return } fmt.Printf("Use signed-url successful!\n") fmt.Println("An Exception was found, which means the client encountered an internal problem when attempting to communicate with OBS, for example, the client was unable to access the network.") fmt.Println(err) } |
相关链接
- 使用过程中返回的错误码含义、问题原因及处理措施可参考OBS错误码。