
# Go SDK
本章节介绍了Go SDK的使用说明，您可以参考本章节进行快速集成开发。
 #### 开发前准备
- 已[注册](https://reg.huaweicloud.com/registerui/public/custom/register.html#/register)华为账号并开通华为云，已进行[实名认证](https://support.huaweicloud.com/usermanual-account/account_auth_00001.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)。
- 已将需要处理的媒资文件上传至MPC同区域的OBS桶中，并将OBS桶进行授权，允许MPC访问。具体请参见[上传音视频文件](https://support.huaweicloud.com/usermanual-mpc/mpc010002.html)和[获取云资源授权](https://support.huaweicloud.com/usermanual-mpc/mpc010003.html)。
 
#### 安装SDK
媒体转码Go SDK支持go 1.14及以上版本。执行go version检查当前Go的版本信息。
使用go get安装Go SDK，执行如下命令安装Go SDK库以及相关依赖库，具体的SDK版本号请参见[SDK开发中心](https://sdkcenter.developer.huaweicloud.com/)。
```
# 安装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"
       "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/mpc/v1"
       "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/mpc/v1/model"
       "net/http"
   )
   ```
   
   
2. 配置客户端属性。 
   1. 默认配置
      ```
      # Use default configuration
      httpConfig := config.DefaultHttpConfig()
      ```
      
   
   2. 代理配置（可选）。
      ```
      username := os.Getenv("USER_NAME")
      password := os.Getenv("USER_PASSWORD")
      // 根据需要配置网络代理
      httpConfig.WithProxy(config.NewProxy().
          WithSchema("http").
          WithHost("proxy.huaweicloud.com").
          WithPort(80).
          WithUsername(username).
          WithPassword(password))
      ```
      
   
   3. SSL配置（可选）
      ```
      // 根据需要配置是否跳过SSL证书校验
      httpConfig.WithIgnoreSSLVerification(true);
      ```
      
   
   
   
   
3. 初始化认证信息。 
   支持两种方式认证，您可以根据实际情况进行选择。
   - 使用永久AK/SK 首先需要获取永久AK和SK，以及projectId，您可以参考[开发前准备]获取。
     ```
     ak := os.Getenv("SDK_AK")
     sk := os.Getenv("SDK_SK")
     projectId := os.Getenv("PROJECT_ID")
     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)。
     ```
     ak := os.Getenv("SDK_AK")
     sk := os.Getenv("SDK_SK")
     projectId := os.Getenv("PROJECT_ID")
     securityToken := os.Getenv("SECURITY_TOKEN")
     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. 初始化客户端。 
   ```
   # 初始化MPC的客户端
   client := mpc.NewMpcClient
   (
       mpcMpcClientBuilder().
           WithEndpoint(endpoint).     // endpoint值如 "https://mpc.region01.myhuaweicloud.com"
           WithCredential(auth).
           WithHttpConfig(config.DefaultHttpConfig()).  
           Build())
   ```
   **endpoint：** MPC应用区域和各服务的终端节点，具体请参见[地区和终端节点](https://developer.huaweicloud.com/endpoint?MPC)。
   
   
5. 发送请求并查看响应。 
   ```
   // 初始化请求，以调用接口查询转码模板为例
   request := &model.ListTranscodingTaskRequest{    
       TaskId:&[]int64{1900293},
   }
   response, err := client.ListTranscodingTask(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.ListTranscodingTask(request)
   if err == nil {
       fmt.Println(response)
   } else {
       fmt.Println(err)
   }
   ```
   
   
7. 原始Http侦听器。 
   在某些场景下可能对业务发出的Http请求进行Debug，需要看到原始的Http请求和返回信息，SDK提供侦听器功能来获取原始的为加密的Http请求和返回信息。
   ![](https://support.huaweicloud.com/sdkreference-mpc/public_sys-resources/caution_3.0-zh-cn.png)
   原始信息打印仅在debug阶段使用，请不要在生产系统中将原始的Http头和Body信息打印到日志，这些信息并未加密且其中包含敏感数据；当Body体为二进制内容，即Content-Type标识为二进制时 body为"\*\*\*"，详细内容不输出。
   ```
   func RequestHandler(request http.Request) {
       fmt.Println(request)
   }
   func ResponseHandler(response http.Response) {
       fmt.Println(response)
   }
   ak := os.Getenv("SDK_AK")
   sk := os.Getenv("SDK_SK")
   projectId := os.Getenv("{your project id}")
   client := mpc.NewMpcClient(
       mpc.MpcClientBuilder().
           WithEndpoint("{your endpoint}").
           WithCredential(
               basic.NewCredentialsBuilder().
                   WithAk(ak).
                   WithSk(sk).
                   WithProjectId(projectId).
                      Build()).
           WithHttpConfig(config.DefaultHttpConfig().
               WithIgnoreSSLVerification(true).
               WithHttpHandler(httphandler.
                   NewHttpHandler().
                       AddRequestHandler(RequestHandler).
                       AddResponseHandler(ResponseHandler))).Build())
   ```
   
   
 
#### 代码示例
调用前请根据实际情况替换如下变量："SDK_AK"、"SDK_SK"、{your endpoint string}以及{your project id}。
```
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"
    mpc "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/mpc/v1"
    "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/mpc/v1/model"
    "net/http"
)
func RequestHandler(request http.Request) {
    fmt.Println(request)
}
func ResponseHandler(response http.Response) {
    fmt.Println(response)
}
ak := os.Getenv("SDK_AK")
sk := os.Getenv("SDK_SK")
projectId := os.Getenv("{your project id}")
func main() {
    client := mpc.NewMpcClient(
        mpc.MpcClientBuilder().
            WithEndpoint("{your endpoint}").
            WithCredential(
                basic.NewCredentialsBuilder().
                    WithAk(ak).
                    WithSk(sk).
                    WithProjectId(projectId).
                    Build()).
            WithHttpConfig(config.DefaultHttpConfig().
                WithIgnoreSSLVerification(true).
                WithHttpHandler(httphandler.
                    NewHttpHandler().
                        AddRequestHandler(RequestHandler).
                        AddResponseHandler(ResponseHandler))).
            Build())
    request := &model.ListTranscodingTaskRequest{        
        TaskId:&[]int64{1900293},
    }
    response, err := client.ListTranscodingTask(request)
    if err == nil {
        fmt.Println("%+v\n",response)
    } else {
        fmt.Println(err)
    }
}
```
