
# Go SDK使用指导
本章节介绍了Go SDK的使用说明，您可以参考本章节进行快速集成开发。
 #### 开发前准备
- 已[注册](https://reg.huaweicloud.com/registerui/public/custom/register.html?locale=zh-cn#/register)华为账号并开通华为云，完成[实名认证](https://support.huaweicloud.com/usermanual-account/account_auth_00001.html)。
- 具备已备案的域名用于直播推流和播放，并在视频直播控制台[添加推流和播放域名](https://support.huaweicloud.com/iLive-live/live010002.html)，且已完成[域名关联](https://support.huaweicloud.com/iLive-live/live_01_0026.html)。
- 已具备开发环境 ，支持go 1.14及以上版本。
- 已获取华为云账号对应的Access Key（AK）和Secret Access Key（SK）。请在华为云控制台"我的凭证 \> 访问密钥"页面上创建和查看您的AK/SK。具体请参见[访问密钥](https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html)。
- 已获取直播服务对应区域的项目ID，请在华为云控制台"我的凭证 \> API凭证"页面上查看项目ID。具体请参见[API凭证](https://support.huaweicloud.com/usermanual-ca/ca_01_0002.html)。
 
#### 安装SDK
视频直播服务端Go SDK支持go 1.14及以上版本。执行go version检查当前Go的版本信息。
使用go get安装华为云Go SDK，执行如下命令安装华为云Go SDK库以及相关依赖库，具体的SDK版本号请参见[SDK开发中心](https://console.huaweicloud.com/apiexplorer/#/sdkcenter)。
```
# 安装华为云Go库
go get github.com/huaweicloud/huaweicloud-sdk-go-v3
# 安装依赖
go get github.com/json-iterator/go
```
#### 开始使用
1. 导入依赖模块。 
   ```
   import (
       "fmt"
       "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"
       "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/config"
       "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/httphandler"
       live "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/live/v1"
       "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/live/v1/model"
       "net/http"
       "os"
   )
   ```
   
   
2. 配置客户端属性。 
   1. 默认配置
      ```
      # Use default configuration
      httpConfig := config.DefaultHttpConfig()
      ```
      
   
   2. （可选操作）配置代理。
      ```
      // 根据需要配置网络代理
      // 代理服务器的password直接写入代码，会有很大安全风险。建议密文形式存储在配置文件或者环境变量中，待使用时再解密，以确保安全。
      // 代理配置设置前，请先在本地环境中设置环境变量PROXY_PASSWORD
      httpConfig.WithProxy(config.NewProxy().
          WithSchema("http").
          WithHost("proxy.huaweicloud.com").
          WithPort(80).
          WithUsername("testuser").
          WithPassword(os.Getenv("PROXY_PASSWORD")))
      ```
      
   
   3. （可选操作）配置连接。
      ```
      httpConfig.WithTimeout(30);
      ```
      
   
   4. （可选操作）配置SSL。
      ```
      // 根据需要配置是否跳过SSL证书校验
      httpConfig.WithIgnoreSSLVerification(true);
      ```
      
   
   
   
   
3. 初始化认证信息。 
   支持两种方式认证，您可以根据实际情况进行选择。
   - 使用永久AK/SK 首先需要获取永久AK和SK，以及projectId，您可以参考[开发前准备]获取。
     ```
     auth := basic.NewCredentialsBuilder().
                 WithAk(ak).
                 WithSk(sk).
                 WithProjectId(projectId).
                 Build()
     ```
     
   
   - 使用临时AK/SK 首先需要获取临时AK、SK和SecurityToken，您可以[通过token获取](https://support.huaweicloud.com/api-iam/iam_04_0002.html)或者[通过委托授权获取](https://support.huaweicloud.com/api-iam/iam_04_0101.html)。
     ```
     auth := basic.NewCredentialsBuilder().
                 WithAk(ak).
                 WithSk(sk).
                 WithProjectId(projectId).
                 WithSecurityToken(securityToken).
                 Build()
     ```
     
   
   
   相关参数说明如下所示：
   - **ak**：华为云账号Access Key，建议以密文形式存储在配置文件或者环境变量中，待使用时再解密，以确保安全。
   
   - **sk**：华为云账号Secret Access Key，建议以密文形式存储在配置文件或者环境变量中，待使用时再解密，以确保安全。
   
   
   
   - **projectId**：云服务所在项目ID ，根据您需要操作的项目所属区域选择对应的项目ID 。
   
   - **securityToken**：采用临时AK/SK认证场景下的安全票据。
    
   
   
4. 初始化客户端。 
   ```
   # 初始化直播服务的客户端
   client := live.NewLiveClient(
       live.LiveClientBuilder().
           WithEndpoints(endpoints).
           WithCredential(auth).
           WithHttpConfig(config.DefaultHttpConfig()).  
           Build())
   ```
   **endpoint** ：直播服务应用区域和各服务的终端节点，具体请参见[地区和终端节点](https://developer.huaweicloud.com/endpoint?Live)。
   
   
5. 发送请求并查看响应。 
   ```
   // 初始化请求，以调用接口查询直播转码模板为例
   request := &model.ShowTranscodingsTemplateRequest{
       Domain: "play.example.huaweicloud.com",
   }
   response, err := client.ShowTranscodingsTemplate(request)
   if err == nil {
       fmt.Printf("%+v\n",response)
   } else {
       fmt.Println(err)
   }
   ```
   
   
6. 异常处理。 
   表1异常处理 
   | 一级分类                 | 一级分类说明                 |
   |:---|:---|
   | ServiceResponseError | service response error |
   | url.Error            | connect endpoint error |
      
   ```
   # 异常处理
   response, err := client.ShowTranscodingsTemplate(request)
   if err == nil {
       fmt.Println(response)
   } else {
       fmt.Println(err)
   }
   ```
   
   
7. 原始Http侦听器。 
   在某些场景下可能对业务发出的Http请求进行Debug，需要看到原始的Http请求和返回信息，SDK提供侦听器功能获取原始的和加密的Http请求和返回信息。
   ![](https://support.huaweicloud.com/ssdk-live/public_sys-resources/caution_3.0-zh-cn.png)
   原始信息打印仅在debug阶段使用，请不要在生产系统中将原始的Http头和Body信息打印到日志，这些信息并未加密且其中包含敏感数据；当Body体为二进制内容，即Content-Type标识为二进制时body为"\*\*\*"，详细内容不输出。
   认证用的ak和sk直接写到代码中有很大的安全风险，建议在配置文件或者环境变量中密文存放，使用时解密，确保安全。
   本示例以ak和sk保存在环境变量中为例，运行本示例前请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
   ```
   func RequestHandler(request http.Request) {
       fmt.Println(request)
   }
   func ResponseHandler(response http.Response) {
       fmt.Println(response)
   }
   client := live.NewLiveAPIClient(
       live.LiveAPIClientBuilder().
           WithEndpoints([]string{"{your endpoint}"}).
           WithCredential(
               basic.NewCredentialsBuilder().
                   WithAk(os.Getenv("HUAWEICLOUD_SDK_AK")).
                   WithSk(os.Getenv("HUAWEICLOUD_SDK_SK")).
                   WithProjectId("{your project id}").
                      Build()).
           WithHttpConfig(config.DefaultHttpConfig().
               WithIgnoreSSLVerification(true).
               WithHttpHandler(httphandler.
                   NewHttpHandler().
                       AddRequestHandler(RequestHandler).
                       AddResponseHandler(ResponseHandler))).
           Build())
   ```
   
   
 
#### 代码示例
调用前请根据实际情况替换如下变量：{your endpoint} 以及 {your project id}。
认证用的AK、SK直接写入代码，会有很大安全风险，建议密文形式存放在配置文件或者环境变量中，待使用时再解密，以确保安全。
本示例以AK、SK保存在环境变量中为例。运行本示例前，请先在本地环境中设置环境变量HUAWEICLOUD_SDK_AK和HUAWEICLOUD_SDK_SK。
```
package main
import (
    "fmt"
    "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"
    "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/config"
    "github.com/huaweicloud/huaweicloud-sdk-go-v3/core/httphandler"
    live "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/live/v1"
    "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/live/v1/model"
    "net/http"
    "os"
)
func RequestHandler(request http.Request) {
    fmt.Println(request)
}
func ResponseHandler(response http.Response) {
    fmt.Println(response)
}
func main() {
    client := live.NewLiveAPIClient(
        live.LiveAPIClientBuilder().
            WithEndpoints([]string{"{your endpoint}"}).
            WithCredential(
                basic.NewCredentialsBuilder().
                    WithAk(os.Getenv("HUAWEICLOUD_SDK_AK")).
                    WithSk(os.Getenv("HUAWEICLOUD_SDK_SK")).
                    WithProjectId("{your project id}").
                    Build()).
            WithHttpConfig(config.DefaultHttpConfig().
                WithIgnoreSSLVerification(true).
                WithHttpHandler(httphandler.
                    NewHttpHandler().
                        AddRequestHandler(RequestHandler).
                        AddResponseHandler(ResponseHandler))).
            Build())
    request := &model.ShowTranscodingsTemplateRequest{
        Domain: "play.example.huaweicloud.com",
    }
    response, err := client.ShowTranscodingsTemplate(request)
    if err == nil {
        fmt.Println("%+v\n",response)
    } else {
        fmt.Println(err)
    }
}
```
