
# ObsClient初始化(Go SDK)
#### 功能说明
ObsClient是访问OBS服务的Go客户端，它为调用者提供一系列与OBS服务进行交互的接口，用于管理、操作桶（Bucket）和对象（Object）等OBS服务上的资源。使用OBS Go SDK向OBS发起请求，您需要初始化一个ObsClient实例，并根据需要调整客户端配置参数。
#### 初始化方法
```
func New(ak, sk, endpoint string, configurers ...configurer) (*ObsClient, error)
```
#### 参数描述
| **字段名**       | **类型**                 | **约束** | **说明**                                                                                                                                                                                  |
|:---|:---|:---|:---|
| ak            | string                 | 必选     | 访问密钥中的AK。                                                                                                                                                                               |
| sk            | string                 | 必选     | 访问密钥中的SK。                                                                                                                                                                               |
| endpoint      | string                 | 必选     | 连接OBS的服务地址。包含协议类型、域名（或IP）、端口号。示例：https://your-endpoint:443。（出于安全性考虑，建议使用https协议） 您可以从[这里](https://developer.huaweicloud.com/endpoint?OBS)查看OBS当前开通的服务地址。 |
| securityToken | string                 | 可选     | 临时访问密钥中的SecurityToken。                                                                                                                                                                  |
| configurers   | configurer（obs包中的私有类型） | 可选     | 一组用于配置ObsClient的参数，可进行连接超时时间、最大重试次数、最大连接数等配置。                                                                                                                                           |
   
#### 可用的configurer
您可通过configurer（obs命名空间中的私有类型）对ObsClient进行配置，可用的configurer见下表：
| **创建方式**                                                    | **描述**                                                                                                                                                          | **建议值**   |
|:---|:---|:---|
| WithSslVerifyAndPemCerts(sslVerify bool, pemCerts \[\]byte) | 配置验证服务端证书的参数。默认为不验证。                                                                                                                                            | N/A       |
| WithHeaderTimeout(headerTimeout int)                        | 配置获取响应头的超时时间。默认为60秒。                                                                                                                                            | \[10，60\] |
| WithMaxConnections(maxIdleConns int)                        | 配置允许最大HTTP空闲连接数。默认为1000。                                                                                                                                        | N/A       |
| WithConnectTimeout(connectTimeout int)                      | 配置建立HTTP/HTTPS连接的超时时间（单位：秒）。默认为60秒。                                                                                                                             | \[10，60\] |
| WithSocketTimeout(socketTimeout int)                        | 配置读写数据的超时时间（单位：秒）。默认为60秒。                                                                                                                                       | \[10，60\] |
| WithIdleConnTimeout(idleConnTimeout int)                    | 配置空闲的HTTP连接在连接池中的超时时间（单位：秒）。默认为30秒。                                                                                                                             | 默认        |
| WithMaxRetryCount(maxRetryCount int)                        | 配置HTTP/HTTPS连接异常时的请求重试次数。默认为3次。                                                                                                                                 | \[1，5\]   |
| WithProxyUrl(proxyUrl string)                               | 配置HTTP代理。                                                                                                                                                       | N/A       |
| WithCustomDomainName(cname bool)                            | 是否通过自定义域名访问OBS服务。默认为false。 说明： 为了保护您的业务不受华为云公共域名被相关机构接管的影响，建议优先选择自定义域名。 | 默认        |
| WithHttpTransport(transport \*http.Transport)               | 配置自定义的Transport。                                                                                                                                                | 默认        |
| WithRequestContext(ctx context.Context)                     | 配置每次HTTP请求的上下文。                                                                                                                                                 | N/A       |
| WithMaxRedirectCount(maxRedirectCount int)                  | 配置HTTP/HTTPS请求重定向的最大次数。默认为3次。                                                                                                                                   | \[1，5\]   |
| WithSecurityToken(securityToken string)                     | 配置临时访问密钥中的SecurityToken                                                                                                                                         | N/A       |
   
![](https://support.huaweicloud.com/sdk-go-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
- 建议值为N/A的表示需要根据实际情况进行设置。
- 如网络状况不佳，建议增大WithConnectTimeout和WithSocketTimeout的值。
 
#### 代码示例
- 您可以通过New函数创建OBS客户端，永久访问密钥（AK/SK）创建OBS客户端示例代码如下：
  ```
  package main
  // 引入依赖包
  import (
      "os"
      obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
  )
  func main() {
      //推荐通过环境变量获取AKSK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
      //您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
      ak := os.Getenv("AccessKeyID")
      sk := os.Getenv("SecretAccessKey")
      // endpoint填写Bucket对应的Endpoint， 这里以华北-北京四为例，其他地区请按实际情况填写。
      endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
      // 创建obsClient实例
      obsClient, err := obs.New(ak, sk, endPoint)
      if err == nil {
           // 使用访问OBS
           // 关闭obsClient
           obsClient.Close()
      }
  }
  ```
  

- 携带代理proxy创建OBS客户端代码如下：
  ```
  package main
  // 引入依赖包
  import (
      "os"
         obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
  )
  func main() {
      //推荐通过环境变量获取AKSK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
      //您可以登录访问管理控制台获取访问密钥AK/SK，获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html。
      ak := os.Getenv("AccessKeyID")
      sk := os.Getenv("SecretAccessKey")
      // endpoint填写Bucket对应的Endpoint， 这里以华北-北京四为例，其他地区请按实际情况填写。
      endPoint := "https://obs.cn-north-4.myhuaweicloud.com"
      // 创建obsClient实例
      obsClient, err := obs.New(ak, sk, endPoint, obs.WithProxyUrl("https://username:password%21@yourProxy"))
      if err == nil {
           // 使用访问OBS
           // 关闭obsClient
           obsClient.Close()
      }
  }
  ```
  

- 临时访问密钥（AK/SK和SecurityToken）创建OBS客户端代码如下：
  ```
  package main
  // 引入依赖包
  import (
      "os"
      obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
  )
  func main() {
      //推荐通过环境变量获取AKSK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
      //您可以登录访问管理控制台获取访问密钥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 {
           // 使用访问OBS
           // 关闭obsClient
           obsClient.Close()
      }
  }
  ```
  
- 您还可以通过配置系统环境变量的方式或者通过访问ECS服务器获取临时访问密钥的方式创建OBS客户端。
  - 从环境变量中获取访问密钥创建OBS客户端的代码如下：
    ```
    package main
    // 引入依赖包
    import (
        "os"
        obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
    )
    func main() {
        //推荐通过环境变量获取AKSK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
        //您可以登录访问管理控制台获取访问密钥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.WithSecurityProviders(obs.NewEnvSecurityProvider("")))
        if err == nil {
             // 使用访问OBS
             // 关闭obsClient
             obsClient.Close()
        }
    }
    ```
    ![](https://support.huaweicloud.com/sdk-go-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
    以上方式会从当前系统的环境变量中寻找访问密钥，需要对应在环境变量中定义OBS_ACCESS_KEY_ID、OBS_SECRET_ACCESS_KEY字段。同时如果采用临时访问密钥时，还需要在环境变量中定义OBS_SECURITY_TOKEN字段。
    
  
  - 从ECS获取临时访问密钥创建OBS客户端的代码如下：
    ```
    package main
    // 引入依赖包
    import (
        "os"
        obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
    )
    func main() {
        //推荐通过环境变量获取AKSK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
        //您可以登录访问管理控制台获取访问密钥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.WithSecurityProviders(obs.NewEcsSecurityProvider(1)))
        if err == nil {
             // 使用访问OBS
             // 关闭obsClient
             obsClient.Close()
        }
    }
    ```
    ![](https://support.huaweicloud.com/sdk-go-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
    当应用程序部署在ECS服务器上且该ECS绑定了相关委托项时，可以采用以上方式从ECS服务器上自动获取临时访问密钥。
    
  
  - 使用链式方式从系统环境变量及ECS上获取访问密钥创建OBS客户端的代码如下：
    ```
    package main
    // 引入依赖包
    import (
        "os"
        obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
    )
    func main() {
        //推荐通过环境变量获取AKSK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
        //您可以登录访问管理控制台获取访问密钥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.WithSecurityProviders(obs.NewEnvSecurityProvider(""), obs.NewEcsSecurityProvider(1)),
        )
        if err == nil {
             // 使用访问OBS
             // 关闭obsClient
             obsClient.Close()
        }
    }
    ```
    ![](https://support.huaweicloud.com/sdk-go-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
    以上初始化过程指定以链式的方式从环境变量和ECS中顺序获取访问密钥，并采用第一组成功获取到的访问密钥创建obsClient。
    
   
![](https://support.huaweicloud.com/sdk-go-devg-obs/public_sys-resources/note_3.0-zh-cn.png)
- 您的工程中可以有多个ObsClient，也可以只有一个ObsClient。

- ObsClient是协程安全的，可在并发场景下使用。
- ObsClient在调用ObsClient.close方法关闭后不能再次使用。
 
- 您可以通过调用WithHttpTransport传入自定义Transport实现指定单Host最大连接数的功能，示例代码如下：
  ```
  package main
  // 引入依赖包
  import (
      "os"
         "time"
      "net/http"
      obs "github.com/huaweicloud/huaweicloud-sdk-go-obs/obs"
  )
  func main() {
      //推荐通过环境变量获取AKSK，这里也可以使用其他外部引入方式传入，如果使用硬编码可能会存在泄露风险。
      //您可以登录访问管理控制台获取访问密钥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"
      // 初始化自定义transport
      var maxIdleConns = 1000
      var maxConnsPerHost = 1000
      var idleConnTimeout = 30
      var transport = &http.Transport{
          MaxIdleConns:        maxIdleConns,
          MaxIdleConnsPerHost: maxIdleConns,
          MaxConnsPerHost:     maxConnsPerHost,
          IdleConnTimeout:     time.Second * time.Duration(idleConnTimeout),
      }
      // 创建obsClient实例
      // 如果使用临时AKSK和SecurityToken访问OBS，需要在创建实例时通过obs.WithSecurityToken方法指定securityToken值。
      obsClient, err := obs.New(ak, sk, endPoint,obs.WithHttpTransport(transport))
      if err == nil {
          // 使用访问OBS
          // 关闭obsClient
          obsClient.Close()
      }
  }
  ```
  ![](https://support.huaweicloud.com/sdk-go-devg-obs/public_sys-resources/notice_3.0-zh-cn.png)
  - 只有在Golang 1.11以上的版本中才支持在Transport结构中指定MaxConnsPerHost参数。
  
  - 如果指定了自定义的Transport，则无法通过WithMaxConnections、WithProxyUrl等配置方法配置Transport相关的最大空闲连接数、代理配置等参数，对应参数应直接在自定义Transport中指定。
    
 
