更新时间:2026-05-26 GMT+08:00
分享

获取桶的自定义域名(C SDK)

开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。

功能介绍

桶的自定义域名功能,支持为OBS桶配置自定义域名,用户可以通过自己的域名访问OBS服务。

调用获取桶自定义域名接口,您可以获取指定桶的自定义域名配置信息。

接口约束

  • 您必须是桶拥有者或拥有获取桶自定义域名的权限,才能获取桶自定义域名。建议使用IAM或桶策略进行授权,如果使用IAM则需授予obs:bucket:GetBucketCustomDomain权限,如果使用桶策略则需授予GetBucketCustomDomain权限。相关授权方式介绍可参见OBS权限控制概述,配置方式详见使用IAM自定义策略自定义创建桶策略
  • OBS支持的Region与Endpoint的对应关系,详细信息请参见地区与终端节点

方法定义

1
void get_bucket_custom_domain(const obs_options *options, obs_get_bucket_custom_domain_handler*handler, void *callback_data);

请求参数说明

表1 请求参数列表

参数名称

参数类型

是否必选

描述

options

const obs_options*

必选

参数解释:

请求桶的上下文,配置option(C SDK),通过obs_options设置AK、SK、endpoint、bucket、超时时间、临时鉴权。

约束限制:

取值范围:

默认取值:

handler

obs_get_bucket_custom_domain_handler *

必选

参数解释:

回调结构体,结构体内所有成员都是回调函数的指针,用于设置处理接口响应数据的回调函数。您可以通过设置回调函数,把服务端的响应数据复制到您的自定义回调数据callback_data中。

约束限制:

取值范围:

默认取值:

callback_data

void *

可选

参数解释:

用户自定义回调数据。

约束限制:

取值范围:

默认取值:

表2 obs_options

参数名称

参数类型

是否必选

描述

bucket_options

obs_bucket_context

必选

参数解释:

桶相关设置。

约束限制:

取值范围:

默认取值:

request_options

obs_http_request_option

必选

参数解释:

请求相关设置。

约束限制:

取值范围:

默认取值:

temp_auth

temp_auth_configure*

可选

参数解释:

用于临时计算签名的结构体,不使用时请设置为NULL。

约束限制:

取值范围:

默认取值:

表3 obs_bucket_context

参数名称

参数类型

是否必选

描述

host_name

char *

必选

参数解释

连接OBS的服务地址,请求使用的主机名,是指存放资源的服务器的域名,就是终端节点endpoint。

示例:host_name = "obs.cn-north-4.myhuaweicloud.com";

约束限制:

不需要带“http://”或“https://”前缀,通过obs_protocol控制是使用http协议还是https协议。

取值范围:

您可以从这里查看OBS当前开通的服务地址。

默认取值:

bucket_name

char *

必选

参数解释

桶名。

约束限制:

  • 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。
  • 桶命名规则如下:
    • 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。
    • 禁止使用IP地址。
    • 禁止以“-”或“.”开头及结尾。
    • 禁止两个“.”相邻(如:“my..bucket”)。
    • 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。
  • 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。

取值范围:

默认取值:

useCname

bool

可选

参数解释

是否通过自定义域名访问OBS服务。

约束限制:

取值范围:

true:通过自定义域名访问OBS服务。

false:不通过自定义域名访问OBS服务。

默认取值:

false

protocol

obs_protocol

可选

参数解释

是使用http协议还是https协议。

约束限制:

取值范围:

请详见obs_protocol

默认取值:

OBS_PROTOCOL_HTTPS(默认使用https协议)

access_key

char *

必选

参数解释:

访问密钥中的AK。

约束限制:

取值范围:

请详见创建访问密钥

默认取值:

secret_access_key

char *

必选

参数解释:

访问密钥中的SK。

约束限制:

取值范围:

请详见创建访问密钥

默认取值:

storage_class

obs_storage_class

可选

参数解释

创桶时可指定的桶的存储类别。

约束限制:

取值范围:

请详见obs_storage_class

默认取值:

OBS_STORAGE_CLASS_STANDARD(指标准存储类别)

token

char *

可选

参数解释:

临时访问密钥中的SecurityToken。

约束限制:

取值范围:

请详见创建访问密钥

默认取值:

epid

char *

可选

参数解释

创桶时可指定的企业项目ID,开通企业项目的用户可以从企业项目服务获取。

约束限制:

epid格式为uuid,未开通企业项目的用户可以不带该头域。

示例:9892d768-2d13-450f-aac7-ed0e44c2585f

默认取值:

bucket_type

obs_bucket_type

可选

参数解释

创桶时,指定是对象桶还是并行文件系统。

约束限制:

取值范围:

请详见obs_bucket_type

默认取值:

OBS_BUCKET_OBJECT(指对象桶)

bucket_list_type

obs_bucket_list_type

可选

参数解释

列举桶时,确定列举桶的类型:所有桶、对象桶、并行文件系统。

约束限制:

取值范围:

请详见obs_bucket_list_type

表4 obs_protocol

枚举值

说明

OBS_PROTOCOL_HTTPS

使用https协议访问。

OBS_PROTOCOL_HTTP

使用http协议访问。

表5 obs_storage_class

枚举值

说明

OBS_STORAGE_CLASS_STANDARD

标准存储。

标准存储拥有低访问时延和较高的吞吐量,适用于有大量热点对象(平均一个月多次)或小对象(<1MB),且需要频繁访问数据的业务场景。

OBS_STORAGE_CLASS_STANDARD_IA

低频访问存储。

低频访问存储适用于不频繁访问(平均一年少于12次)但在需要时也要求能够快速访问数据的业务场景。

OBS_STORAGE_CLASS_GLACIER

归档存储。

归档存储适用于很少访问(平均一年访问一次)数据的业务场景。

OBS_STORAGE_CLASS_DEEP_ARCHIVE

深度归档存储

适用于长期不访问(平均几年访问一次)数据的业务场景。

表6 obs_bucket_type

枚举值

说明

OBS_BUCKET_OBJECT

对象桶。

OBS_BUCKET_PFS

并行文件系统。

表7 obs_bucket_list_type

枚举值

说明

OBS_BUCKET_LIST_ALL

列举所有桶。

OBS_BUCKET_LIST_OBJECT

列举所有对象桶。

OBS_BUCKET_LIST_PFS

列举所有并行文件系统。

表8 obs_http_request_option

参数名称

参数类型

是否必选

描述

connect_time

int

必选

参数解释

建立HTTP/HTTPS连接的超时时间(单位:毫秒)。

约束限制:

取值范围:

[10000, 60000]

默认取值:

60000

max_connected_time

int

必选

参数解释

请求超时时间(单位:秒)。

约束限制:

取值范围:

默认取值:

0(指永远不会主动断开连接)

proxy_auth

char*

可选

参数解释

代理认证信息,格式为username:password。

约束限制:

取值范围:

默认取值:

proxy_host

char*

可选

参数解释

代理服务器的IP地址或主机名。

约束限制:

取值范围:

默认取值:

表9 temp_auth_configure

参数名称

参数类型

是否必选

描述

expires

long long int

必选

参数解释:

临时鉴权的有效期(单位:秒)。

约束限制:

取值范围:

[0-630720000]

默认取值

temp_auth_callback

void(*temp_auth_callback)(char *temp_auth_url,

uint64_t temp_auth_url_len,

char*temp_auth_headers,

uint64_t temp_auth_headers_len,

void*callback_data)

必选

参数解释:

用户自定义回调函数指针,用于将临时url以及涉及的计算签名头域记录到用户自定义回调数据中。

约束限制:

取值范围:

默认取值

callback_data

void *

必选

参数解释:

用户自定义回调数据。

约束限制:

取值范围:

默认取值

表10 temp_auth_callback

参数名称

参数类型

是否必选

描述

temp_auth_url

char *

必选

参数解释:

临时鉴权的URL。OBS服务支持用户构造一个特定操作的URL,这个URL的Query参数中会包含用户AK、签名、有效期等信息,任何拿到这个URL的人均可执行临时鉴权操作,OBS服务收到这个请求后认为该请求就是签发URL用户自己在执行操作。例如构造一个携带签名信息的下载对象的URL,拿到相应URL的人都能下载这个对象,但该URL只在Expires指定的失效时间内有效。

约束限制:

取值范围:

默认取值

temp_auth_url_len

uint64_t

必选

参数解释:

临时鉴权的URL的长度。

约束限制:

取值范围:

默认取值

temp_auth_headers

char *

必选

参数解释:

临时鉴权的headers。

约束限制:

取值范围:

默认取值

temp_auth_headers_len

uint64_t

必选

参数解释:

临时鉴权的headers的数量。

约束限制:

取值范围:

默认取值

callback_data

void *

必选

参数解释:

用户自定义回调数据。

约束限制:

取值范围:

默认取值

表11 obs_response_handler

参数名称

参数类型

是否必选

描述

properties_callback

obs_response_properties_callback *

必选

参数解释:

响应回调函数指针,可以在这个回调中把properties的内容记录到callback_data(用户自定义回调数据)中。

约束限制:

取值范围:

默认取值

complete_callback

obs_response_complete_callback *

必选

参数解释:

结束回调函数指针,可以在这个回调中把obs_statusobs_error_details的内容记录到callback_data(用户自定义回调数据)中。

约束限制:

取值范围:

默认取值

表12 obs_response_properties_callback

参数名称

参数类型

是否必选

描述

properties

const obs_response_properties*

必选

参数解释:

响应头域中的参数,建议将其内容记录到callback_data(用户自定义回调数据)中。

约束限制:

取值范围:

默认取值

callback_data

void *

必选

参数解释:

用户自定义回调数据指针。

约束限制:

取值范围:

默认取值

表13 obs_response_complete_callback

参数名称

参数类型

是否必选

描述

status

obs_status

必选

参数解释:

SDK内部的请求状态码。

约束限制:

取值范围:

请详见obs_status

默认取值

error_details

const obs_error_details*

必选

参数解释:

响应回调函数指针,可以在这个回调中把properties的内容记录到callback_data(用户自定义回调数据)中。

约束限制:

取值范围:

默认取值

callback_data

void *

必选

参数解释:

用户自定义回调数据指针。

约束限制:

取值范围:

默认取值

表14 obs_response_properties

参数名称

参数类型

是否必选

描述

request_id

const char *

可选

参数解释:

由OBS创建来唯一确定本次请求的值,可以通过该值来定位问题。

约束限制:

取值范围:

默认取值

request_id2

const char *

可选

参数解释:

帮助定位问题的特殊符号。

约束限制:

取值范围:

默认取值

content_type

const char *

可选

参数解释:

对象的文件类型(MIME类型)。Content-Type(MIME)用于标识发送或接收数据的类型,浏览器根据该参数来决定数据的打开方式。

约束限制:

取值范围:

默认取值

content_length

uint64_t

可选

参数解释:

响应消息体的字节长度。

约束限制:

取值范围:

默认取值

server

const char *

可选

参数解释:

HTTP请求中的Server头域。

约束限制:

取值范围:

默认取值

etag

const char *

可选

参数解释:

对象的base64编码的128位MD5摘要。ETag是对象内容的唯一标识,可以通过该值识别对象内容是否有变化。比如上传对象时ETag为A,下载对象时ETag为B,则说明对象内容发生了变化。ETag只反映变化的内容,而不是其元数据。上传的对象或复制操作创建的对象,都有唯一的ETag。

约束限制:

当对象是服务端加密的对象时,ETag值不是对象的MD5值。

取值范围:

长度为32的字符串。

默认取值:

expiration

const char *

可选

参数解释:

对象的详细过期信息。

约束限制:

取值范围:

大于0的整型数,单位:天。

默认取值:

website_redirect_location

const char *

可选

参数解释:

当桶设置了Website配置,就可以设置对象元数据的这个属性,Website接入点返回301重定向响应,将获取这个对象的请求重定向到该属性指定的桶内另一个对象或一个外部的URL,该参数指明对象的重定向地址。

例如,重定向请求到桶内另一对象:

x-obs-website-redirect-location:/anotherPage.html

或重定向请求到一个外部URL:

x-obs-website-redirect-location:http://www.example.com/

OBS将这个值从头域中取出,保存在对象的元数据“WebsiteRedirectLocation”中。

约束限制:

  • 必须以“/”、“http://”或“https://”开头,长度不超过2KB。
  • OBS仅支持为桶根目录下的对象设置重定向,不支持为桶中文件夹下的对象设置重定向。

取值范围:

默认取值:

version_id

const char *

可选

参数解释:

对象的版本号。

约束限制:

如果该对象无版本号,则为NULL。

取值范围:

长度为32的字符串。

默认取值

meta_data_count

int

可选

参数解释:

meta_data数组中的元素个数。

约束限制:

取值范围:

默认取值:

meta_data

const obs_name_value *

可选

参数解释:

对象的自定义元数据。OBS支持用户使用以“x-obs-meta-”开头的消息头来加入自定义的元数据,以便对对象进行自定义管理。当用户获取此对象或查询此对象元数据时,加入的自定义元数据将会在返回的消息头中出现。

约束限制:

取值范围:

默认取值

use_server_side_encryption

char

可选

参数解释:

如果开启了服务端加密,会被置为'\1'。

约束限制:

取值范围:

默认取值:

allow_origin

const char *

可选

参数解释:

当桶设置了CORS配置,如果请求中的Origin满足服务端的CORS配置,则在响应中包含这个Origin。

约束限制:

取值范围:

符合CORS协议的取值范围。

默认取值:

allow_headers

const char *

可选

参数解释:

当桶设置了CORS配置,如果请求的headers满足服务端的CORS配置,则在响应中包含这个headers。

约束限制:

最多可填写一个“*”通配符,不支持&、:、<、空格以及中文字符。

取值范围:

符合CORS协议的取值范围。

默认取值:

max_age

const char *

可选

参数解释:

桶CORS规则中的MaxAgeSeconds。MaxAgeSeconds指请求来源的客户端可以对跨域请求返回结果的缓存时间。

约束限制:

每个CORSRule可以包含至多一个MaxAgeSeconds。

取值范围:

大于等于0的整型数,单位:秒。

默认取值:

3000

allow_methods

const char *

可选

参数解释:

当桶设置了CORS配置,如果请求的Access-Control-Request-Method满足服务端的CORS配置,则在响应中包含这条rule中的Methods。

约束限制:

取值范围:

  • GET
  • PUT
  • HEAD
  • POST
  • DELETE

取值范围:

expose_headers

const char *

可选

参数解释:

桶CORS规则中的ExposeHeader。ExposeHeader是指CORS规则允许响应中可返回的附加头域,给客户端提供额外的信息。默认情况下浏览器只能访问以下头域:Content-Length、Content-Type,如果需要访问其他头域,需要在附加头域中配置。

约束限制:

不支持*、&、:、<、空格以及中文字符。

取值范围:

默认取值:

storage_class

const char *

可选

参数解释:

对象的存储类别。

约束限制:

仅当对象为非标准存储类别时,会返回此头域。

取值范围:
  • WARM(指低频存储)
  • COLD(指归档存储)
  • DEEP_ARCHIVE(指深度归档存储)

默认取值:

server_side_encryption

const char *

可选

参数解释:

该头域表示服务端的加密方式。

示例:x-obs-server-side-encryption:kms

约束限制:

如果服务端加密是SSE-KMS方式,响应包含该头域。

取值范围:

  • kms(指SSE-KMS加密方式)
  • obs(指SSE-OBS加密方式)

默认取值:

kms_key_id

const char *

可选

参数描述:

密钥ID。当加密方式为SSE-KMS且使用指定密钥加密时,需输入密钥ID。

约束限制:

当您设置了server_side_encryption且赋值为“kms”,即选择kms加密方式时,才能使用该头域指定加密密钥。

取值范围:

默认取值:

当您选择使用kms加密方式,但未设置此头域时,默认的主密钥将会被使用。如果默认主密钥不存在,系统将默认创建并使用。

customer_algorithm

const char *

可选

参数解释:

如果服务端加密是SSE-C方式,响应包含该头域,该头域表示解密使用的算法。

约束限制:

取值范围:

AES256(指AES256解密算法)

默认取值:

customer_key_md5

const char *

可选

参数解释:

如果服务端加密是SSE-C方式,响应包含该头域,该头域表示解密使用的密钥的MD5值。

约束限制:

由密钥值经过MD5加密再经过Base64编码后得到,示例:4XvB3tbNTN+tIEVa0/fGaQ==。

取值范围:

密钥ID MD5的base64值。

默认取值:

bucket_location

const char *

可选

参数解释:

桶的区域位置信息。

约束限制:

取值范围:

默认取值:

obs_version

const char *

可选

参数解释:

桶所在的OBS服务版本号。

约束限制:

取值范围:

  • 3.0:最新版本的桶。
  • --:表示老版本的桶。

默认取值:

restore

const char *

可选

参数解释:

标识对象的恢复状态。

示例:正在恢复ongoing-request="true";已恢复 ongoing-request="false", expiry-date="Wed, 7 Nov 2012 00:00:00 GMT"。其中expiry-date表示对象恢复后的失效时间。

约束限制:

仅当对象为归档存储或深度归档存储类别,并且处于正在恢复或已经恢复时,会返回此头域。

取值范围:

默认取值:

obs_object_type

const char *

可选

参数解释:

对象的类型。

约束限制:

仅当对象为非Normal对象时,会返回此头域。

取值范围:

Appendable

默认取值:

obs_next_append_position

const char *

可选

参数解释:

指明下一次请求应该提供的position。

约束限制:

仅当对象为Appendable对象时,会返回此头域。

取值范围:

默认取值:

obs_head_epid

const char *

可选

参数解释:

当前桶的企业项目ID,开通企业项目的用户可以从企业项目服务获取。

约束限制:

格式为uuid,未开通企业项目的用户可以不带该头域。

取值范围:

默认取值:

reserved_indicator

const char *

可选

参数解释:

帮助定位问题的特殊符号。

约束限制:

取值范围:

默认取值:

表15 obs_error_details

参数名称

参数类型

描述

message

const char*

参数解释:

错误响应消息体XML中具体错误更全面、详细的英文解释。

约束限制:

取值范围:

取值范围可参见错误码

默认取值:

resource

const char*

参数解释:

该错误相关的桶或对象资源。

约束限制:

取值范围:

默认取值:

further_details

const char*

参数解释:

错误响应消息体XML中的FurtherDetails元素的值。

约束限制:

取值范围:

默认取值:

extra_details_count

int

参数解释:

错误响应消息体XML中的其他元素的数量。

约束限制:

取值范围:

默认取值:

extra_details

obs_name_value*

参数解释:

错误响应消息体XML中的其他元素的值。

约束限制:

error_headers_count

int

参数解释:

error_headers的头域数量。

约束限制:

取值范围:

默认取值:

error_headers

char**

参数解释:

响应头域中包含error的所有头域。

约束限制:

取值范围:

默认取值:

表16 obs_name_value

参数名称

参数类型

是否必选

描述

name

char *

可选

参数解释:

属性的键。

约束限制:

取值范围:

默认取值:

value

char *

可选

参数解释:

属性的值。

约束限制:

取值范围:

默认取值:

表17 obs_status

枚举值

说明

OBS_STATUS_OK

请求成功。

OBS_STATUS_InitCurlFailed

初始化curl失败。

OBS_STATUS_InternalError

内部错误。

OBS_STATUS_OutOfMemory

本地环境内存不足。

OBS_STATUS_FailedToIInitializeRequest

初始化请求失败。

OBS_STATUS_ConnectionFailed

网络连接失败。

OBS_STATUS_XmlParseFailure

xml解析失败。

OBS_STATUS_NameLookupError

域名解析失败。

OBS_STATUS_FailedToConnect

无法连接到服务端。

OBS_STATUS_PartialFile

网络传输。

OBS_STATUS_InvalidParameter

参数非法。

OBS_STATUS_NoToken

当前并发数已经超过最大并发数(默认值1000),通过set_online_request_max_count函数去调整最大并发数。

OBS_STATUS_OpenFileFailed

打开文件失败。

OBS_STATUS_AccessDenied

请求被拒绝。

OBS_STATUS_MalformedPolicy

请求policy格式不正确。

OBS_STATUS_MalformedXML

请求xml格式不正确。

OBS_STATUS_MethodNotAllowed

请求方法不允许。

OBS_STATUS_SignatureDoesNotMatch

签名不匹配,检查ak、sk、token是否对应或有误。

OBS_STATUS_ServiceUnavailable

服务端异常。

OBS_STATUS_SlowDown

请求频率过快。

表18 obs_get_bucket_custom_domain_handler

参数名称

参数类型

是否必选

描述

response_handler

obs_response_handler *

必选

参数解释:

响应回调函数结构体。

约束限制:

取值范围:

默认取值

get_bucket_custom_domain_callback

obs_get_bucket_custom_domain_callback *

必选

参数解释:

回调函数指针,可以在这个回调中把回调的参数记录到callback_data(用户自定义回调数据)中。

约束限制:

取值范围:

默认取值

表19 obs_get_bucket_custom_domain_callback

参数名称

参数类型

是否必选

描述

domains_count

int

必选

参数解释:

桶自定义域名列表长度。

约束限制:

取值范围:

默认取值:

domains_list

obs_name_value *

必选

参数解释:

桶自定义域名列表。

约束限制:

callback_data

void *

必选

参数解释:

用户自定义回调数据指针。

约束限制:

取值范围:

默认取值:

表20 obs_domain_response

参数名称

参数类型

描述

domain_name

const char *

自定义域名

create_time

const char *

创建时间

certificate_id

const char*

证书id

代码示例

以下示例展示如何获取桶自定义域名:
#include "eSDKOBS.h"
#include <stdio.h>
#include <stdlib.h>

// 响应回调函数,可以在这个回调中把properties的内容记录到callback_data(用户自定义回调数据)中
void response_complete_callback(obs_status status, const obs_error_details *error, void *callback_data);
obs_status response_properties_callback(const obs_response_properties *properties, void *callback_data);
void get_bucket_custom_domain_callback(int domains_count, obs_domain_response* domains_list, void* callback_data);

typedef struct bucket_custom_domain_data
{
    obs_status ret_status;
    obs_domain_response domains_list[100];
    int domains_count;
}bucket_custom_domain_data;

int main()
{
    // 以下代码展示如何获取桶自定义域名:
    // 在程序入口调用obs_initialize方法来初始化网络、内存等全局资源。
    obs_initialize(OBS_INIT_ALL);
    obs_options options;
    // 创建并初始化options,该参数包括访问域名(host_name)、访问密钥(access_key_id和acces_key_secret)、桶名(bucket_name)、桶存储类别(storage_class)等配置信息
    init_obs_options(&options);
    options.bucket_options.host_name = "obs.cn-north-4.myhuaweicloud.com";
    options.bucket_options.access_key = getenv("ACCESS_KEY_ID");
    options.bucket_options.secret_access_key = getenv("SECRET_ACCESS_KEY");
    // 填写Bucket名称,例如example-bucket-name。
    char * bucket_name = "example-bucket-name";
    options.bucket_options.bucket_name = bucket_name;
    // 设置响应回调函数
    obs_get_bucket_custom_domain_handler get_bucket_custom_domain_handler = {
        {
            &response_properties_callback,
            &response_complete_callback
        },
        &get_bucket_custom_domain_callback
    };
    bucket_custom_domain_data custom_domain_data = { 0 };
    custom_domain_data.ret_status = OBS_STATUS_BUTT;
    get_bucket_custom_domain(&options, &get_bucket_custom_domain_handler, &custom_domain_data);
    // 判断请求是否成功
    if (custom_domain_data.ret_status == OBS_STATUS_OK) {
        printf("Get bucket custom domain successfully.");
    }
    else
    {
        printf("Get bucket custom domain failed(%s).\n",
            obs_get_status_name(custom_domain_data.ret_status));
    }
    // 释放分配的全局资源
    obs_deinitialize();
}
void get_bucket_custom_domain_callback(int domains_count,
    obs_domain_response* domains_list, void* callback_data) {
    if (callback_data) {
        bucket_custom_domain_data *custom_domain_data = (bucket_custom_domain_data *)callback_data;
        int i = 0;
        for (; i < domains_count; ++i) {
            printf("Domain[%d].name : %s\n", i, domains_list[i].domain_name);
            printf("Domain[%d].certificate_id : %s\n", i, domains_list[i].certificate_id);
            printf("Domain[%d].create_time : %s\n", i, domains_list[i].create_time);
            printf("\n");
        }
    }
    else {
        printf("Callback_data is NULL");
    }
    return;
}
// 响应回调函数,可以在这个回调中把properties的内容记录到callback_data(用户自定义回调数据)中
obs_status response_properties_callback(const obs_response_properties *properties, void *callback_data)
{
    if (properties == NULL)
    {
        printf("error! obs_response_properties is null!");
        if (callback_data != NULL)
        {
            obs_sever_callback_data *data = (obs_sever_callback_data *)callback_data;
            printf("server_callback buf is %s, len is %llu",
                data->buffer, data->buffer_len);
            return OBS_STATUS_OK;
        }
        else {
            printf("error! obs_sever_callback_data is null!");
            return OBS_STATUS_OK;
        }
    }
    // 打印响应信息
#define print_nonnull(name, field)                                 \
    do {                                                           \
        if (properties-> field) {                                  \
            printf("%s: %s\n", name, properties->field);          \
        }                                                          \
    } while (0)
    print_nonnull("request_id", request_id);
    print_nonnull("request_id2", request_id2);
    print_nonnull("content_type", content_type);
    if (properties->content_length) {
        printf("content_length: %llu\n", properties->content_length);
    }
    print_nonnull("server", server);
    print_nonnull("ETag", etag);
    print_nonnull("expiration", expiration);
    print_nonnull("website_redirect_location", website_redirect_location);
    print_nonnull("version_id", version_id);
    print_nonnull("allow_origin", allow_origin);
    print_nonnull("allow_headers", allow_headers);
    print_nonnull("max_age", max_age);
    print_nonnull("allow_methods", allow_methods);
    print_nonnull("expose_headers", expose_headers);
    print_nonnull("storage_class", storage_class);
    print_nonnull("server_side_encryption", server_side_encryption);
    print_nonnull("kms_key_id", kms_key_id);
    print_nonnull("customer_algorithm", customer_algorithm);
    print_nonnull("customer_key_md5", customer_key_md5);
    print_nonnull("bucket_location", bucket_location);
    print_nonnull("obs_version", obs_version);
    print_nonnull("restore", restore);
    print_nonnull("obs_object_type", obs_object_type);
    print_nonnull("obs_next_append_position", obs_next_append_position);
    print_nonnull("obs_head_epid", obs_head_epid);
    print_nonnull("reserved_indicator", reserved_indicator);
    int i;
    for (i = 0; i < properties->meta_data_count; i++) {
        printf("x-obs-meta-%s: %s\n", properties->meta_data[i].name,
            properties->meta_data[i].value);
    }
    return OBS_STATUS_OK;
}
// 结束回调函数,可以在这个回调中把obs_status和obs_error_details的内容记录到callback_data(用户自定义回调数据)中
void response_complete_callback(obs_status status, const obs_error_details *error, void *callback_data)
{
    if (callback_data) {
        bucket_custom_domain_data *custom_domain_data = (bucket_custom_domain_data *)callback_data;
        custom_domain_data->ret_status = status;
    }
    else {
        printf("Callback_data is NULL");
    }
    if (error && error->message) {
        printf("Error Message: \n   %s\n", error->message);
    }
    if (error && error->resource) {
        printf("Error Resource: \n  %s\n", error->resource);
    }
    if (error && error->further_details) {
        printf("Error further_details: \n   %s\n", error->further_details);
    }
    if (error && error->extra_details_count) {
        int i;
        for (i = 0; i < error->extra_details_count; i++) {
            printf("Error Extra Detail(%d):\n   %s:%s\n", i, error->extra_details[i].name,
                error->extra_details[i].value);
        }
    }
    if (error && error->error_headers_count) {
        int i;
        for (i = 0; i < error->error_headers_count; i++) {
            const char *errorHeader = error->error_headers[i];
            printf("Error Headers(%d):\n    %s\n", i, errorHeader == NULL ? "NULL Header" : errorHeader);
        }
    }
}

相关链接

  • 关于获取桶自定义域名的API说明,请参见获取桶自定义域名
  • 获取桶自定义域名过程中返回的错误码含义、问题原因及处理措施可参考OBS错误码

相关文档