Go接入指南
更新時間:
操作步驟
步驟一:安裝依賴
module demo
go 1.21.10
require github.com/google/uuid v1.6.0 // indirect
步驟二:增加Client定義
增加 client.go,按需修改 package 名稱
package main
import (
"bytes"
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"encoding/json"
"fmt"
"net/http"
"strconv"
"time"
"github.com/google/uuid"
)
type Client struct {
endpoint string
appKey string
appSecret string
}
func NewClient(endpoint string, appKey string, appSecret string) *Client {
return &Client{endpoint: endpoint, appKey: appKey, appSecret: appSecret}
}
func (c *Client) Invoke(path string, params map[string]interface{}, headers map[string]string) (*http.Response, error) {
url := fmt.Sprintf("https://%s%s", c.endpoint, path)
// Convert the data to JSON
jsonData, err := json.Marshal(params)
if err != nil {
return nil, fmt.Errorf("marshal params with err: %w", err)
}
// Set up the HTTP client
client := &http.Client{}
// Create the request
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
return nil, fmt.Errorf("create request with err: %w", err)
}
// Set headers
genHeaders := c.generateHeader("POST", path, headers)
req.Header = genHeaders
// Make the request
resp, err := client.Do(req)
if err != nil {
return nil, fmt.Errorf("request with err: %w", err)
}
return resp, nil
}
func (c *Client) generateHeader(httpMethod string, path string, headers map[string]string) http.Header {
timestamp := time.Now().UnixNano() / int64(time.Millisecond)
dateStr := time.Now().UTC().Format("Mon, 02 Jan 2006 15:04:05 MST") + "+00:00"
uuidStr := uuid.New().String()
jsonHeader := "application/json; charset=utf-8"
h := make(http.Header)
h.Set("Date", dateStr)
h.Set("x-ca-key", c.appKey)
h.Set("x-ca-timestamp", strconv.FormatInt(timestamp, 10))
h.Set("x-ca-nonce", uuidStr)
h.Set("x-ca-signature-method", "HmacSHA256")
h.Set("x-ca-signature-headers", "x-ca-timestamp,x-ca-key,x-ca-nonce,x-ca-signature-method")
h.Set("Content-Type", jsonHeader)
h.Set("Accept", jsonHeader)
if len(headers) > 0 {
for k, v := range headers {
h.Set(k, v)
}
}
bodyMd5Str := ""
var buf bytes.Buffer
fmt.Fprintln(&buf, httpMethod)
fmt.Fprintln(&buf, jsonHeader)
fmt.Fprintln(&buf, bodyMd5Str)
fmt.Fprintln(&buf, jsonHeader)
fmt.Fprintln(&buf, dateStr)
fmt.Fprintln(&buf, "x-ca-key:"+c.appKey)
fmt.Fprintln(&buf, "x-ca-nonce:"+uuidStr)
fmt.Fprintln(&buf, "x-ca-signature-method:HmacSHA256")
fmt.Fprintf(&buf, "x-ca-timestamp:%d\n", timestamp)
fmt.Fprint(&buf, path)
mac := hmac.New(sha256.New, []byte(c.appSecret))
mac.Write(buf.Bytes())
h.Set("x-ca-signature", base64.StdEncoding.EncodeToString(mac.Sum(nil)))
return h
}
步驟三:填寫調用AK/SK、調用路徑、調用參數
package main
import (
"fmt"
"io"
)
func main() {
client := Client{
endpoint: "openai.edu-aliyun.com",
appKey: "應用AK",
appSecret: "應用SK",
}
# 調用路徑,具體參見 API
api_path = "/scc/調用路徑"
# 調用參數
params = map[string]interface{}{}
params['參數名稱'] = '參數值'
# 請求頭
headers = map[string]string{}
resp, err := client.Invoke(apiPath, data, headers)
if err != nil {
fmt.Printf("invoke api failed: %v\n", err)
return
}
// Read the response body
body, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("Error reading response:", err)
return
}
// Print the response
fmt.Printf("get body: %s", string(body))
}
文檔內容是否對您有幫助?