akamai/AkamaiOPEN-edgegrid-golang
GitHub: akamai/AkamaiOPEN-edgegrid-golang
Akamai 官方的 Go 语言库,为调用 Akamai OPEN REST API 提供 EdgeGrid 身份验证签名处理与会话管理能力。
Stars: 94 | Forks: 71
# Akamai OPEN EdgeGrid for GoLang v13

[](https://goreportcard.com/report/github.com/akamai/AkamaiOPEN-edgegrid-golang/v13)

[](https://opensource.org/licenses/Apache-2.0)
[](https://pkg.go.dev/github.com/akamai/AkamaiOPEN-edgegrid-golang/v13)
该库为 Go 实现了使用 [Akamai EdgeGrid Authentication](https://techdocs.akamai.com/developer/docs/authenticate-with-edgegrid) 方案的 HTTP 请求身份验证处理器。它目前还为 Akamai Terraform Provider 提供 Akamai REST API 支持。
## 向后兼容性
此模块与 `v1` 不向后兼容。
`master` 分支不再代表 `v1`,目前它代表最新的 `v13`。`v1` 已被移动到专门的 `v1` 分支。
## 并发使用
您可以将该库的包与 `v1` 库一起导入而不会发生任何冲突。例如:
```
import (
papiv1 "github.com/akamai/AkamaiOPEN-edgegrid-golang/papi-v1"
papi "github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/papi"
)
```
## 安装
要使用该库,您的系统需要安装 Go 1.25+。
## 身份验证
您可以通过 API 客户端获取身份验证凭据。对 API 的请求会带有时间戳和签名,并立即执行。
1. [创建身份验证凭据](https://techdocs.akamai.com/developer/docs/edgegrid)。
2. 将您的凭据放在 EdgeGrid 文件 `~/.edgerc` 的 `[default]` 部分。
[default]
client_secret = C113nt53KR3TN6N90yVuAgICxIRwsObLi0E67/N8eRN=
host = akab-h05tnam3wl42son7nktnlnnx-kbob3i3v.luna.akamaiapis.net
access_token = akab-acc35t0k3nodujqunph3w7hzp7-gtm6ij
client_token = akab-c113ntt0k3n4qtari252bfxxbsl-yvsdj
3. 导入 `edgegrid` 包,然后在 `edgegrid.New()` 方法中提供您的资源文件路径和凭据部分标题,以使用您本地的 `.edgerc`。
package main
import (
"fmt"
"io"
"net/http"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
)
func main() {
edgerc, err := edgegrid.New(
edgegrid.WithFile("path/to/.edgerc"),
edgegrid.WithSection("section-header"),
)
...
}
### 从环境变量加载
或者,您可以将凭据传递给环境变量。只有当您使用 `WithEnv()` 方法并将其设置为 `true` 时,该库才会查找环境变量。默认情况下,它会使用以下变量:
- `AKAMAI_HOST`
- `AKAMAI_CLIENT_TOKEN`
- `AKAMAI_CLIENT_SECRET`
- `AKAMAI_ACCESS_TOKEN`
- `AKAMAI_MAX_BODY`
您可以通过将凭据部分标题指定为插入在 `AKAMAI_` 和凭据名称之间的中缀来定义多个配置。`WithEnv()` 方法会使用通过 `WithSection()` 方法配置的凭据部分标题,如果未配置凭据部分标题,则使用 `default`。
例如,当在 `WithSection()` 方法中传入 `ccu` 作为凭据部分标题时,该函数将查找 `AKAMAI_CCU_HOST`。
如果变量不存在,但库已配置为搜索它,则该函数要么仅返回部分配置,要么在您同时使用了 `WithFile()` 方法时回退到从 `.edgerc` 文件填充数据。
```
package main
import (
"fmt"
"io"
"net/http"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
)
func main() {
// Load from AKAMAI_CCU_
edgerc, err := edgegrid.New(
edgegrid.WithEnv(true),
edgegrid.WithSection("ccu"),
)
...
}
```
## 用作 auth signer
导入 `edgegrid` 包来对您的请求进行签名。提供您的 `.edgerc` 路径、凭据部分标题以及适当的 endpoint 信息。
### 示例
```
package main
import (
"fmt"
"io"
"net/http"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
)
func main() {
edgerc, err := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
client := http.Client{}
req, err := http.NewRequest(http.MethodGet, "/identity-management/v3/user-profile", nil)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Accept", "application/json")
edgerc.SignRequest(req)
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
```
### 查询字符串参数
在主 URL 路径末尾的问号 ("?") 之后的 url 中传递查询参数。
```
package main
import (
"fmt"
"io"
"net/http"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
)
func main() {
edgerc, err := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
client := http.Client{}
req, err := http.NewRequest(http.MethodGet, "/identity-management/v3/user-profile?authGrants=true¬ifications=true&actions=true", nil)
...
}
```
或者,您可以使用以下方法之一:
- [`req.URL.Query()`](https://pkg.go.dev/net/url#URL.Query)。用于将特定查询参数添加到现有查询中。
- [`url.Values{}`](https://pkg.go.dev/net/url#Values.Add)。用于构建一组新参数。需要导入 `net/url` 包。
```
package main
import (
"fmt"
"io"
"net/http"
"net/url"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
)
func main() {
edgerc, err := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
client := http.Client{}
req, err := http.NewRequest(http.MethodGet, "/identity-management/v3/user-profile", nil)
if err != nil {
fmt.Println(err)
return
}
// If appending to an existing query
q := req.URL.Query()
q.Add("authGrants", "true")
q.Add("notifications", "true")
q.Add("actions", "true")
// Or if building a new set of params
q := url.Values{}
q.Add("authGrants", "true")
q.Add("notifications", "true")
q.Add("actions", "true")
req.URL.RawQuery = q.Encode()
fmt.Println(req.URL.String())
// Output:
// /identity-management/v3/user-profile?actions=true&authGrants=true¬ifications=true
edgerc.SignRequest(req)
res, err := client.Do(req)
if err != nil {
fmt.Println(err)
return
}
defer res.Body.Close()
body, err := io.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(string(body))
}
```
### 标头
使用 `req.Header.Add()` 方法输入请求标头。
```
package main
import (
"fmt"
"io"
"net/http"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
)
func main() {
edgerc, err := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
client := http.Client{}
req, err := http.NewRequest(http.MethodGet, "/identity-management/v3/user-profile", nil)
if err != nil {
fmt.Println(err)
return
}
req.Header.Add("Accept", "application/json")
edgerc.SignRequest(req)
...
}
```
### 正文数据
导入 `strings` 包,并在 `payload` 属性中将请求正文作为对象提供。
```
package main
import (
"fmt"
"io"
"net/http"
"strings"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
)
func main() {
edgerc, err := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
payload := strings.NewReader(`{
"contactType": "Billing",
"country": "USA",
"firstName": "John",
"lastName": "Smith",
"preferredLanguage": "English",
"sessionTimeOut": 30,
"timeZone": "GMT",
"phone": "3456788765"
}`)
client := http.Client{}
req, err := http.NewRequest(http.MethodPut, "/identity-management/v3/user-profile/basic-info", payload)
...
}
```
### 调试
启用调试以获取有关请求和响应的附加信息。
您可能会发现使用 `fmt.Println()` 效果并不理想,因为其输出未格式化且难以阅读。
要美观地打印 HTTP 请求和响应,请使用以下方法:
- [`httputil.DumpRequest()`](https://pkg.go.dev/net/http/httputil#DumpRequest)。用于在服务器端美观地打印请求。
- [`httputil.DumpRequestOut()`](https://pkg.go.dev/net/http/httputil#DumpRequestOut)。用于在客户端转储请求。
- [`httputil.DumpResponse()`](https://pkg.go.dev/net/http/httputil#DumpResponse)。用于记录服务器响应。
在这些函数中的每一个中,第二个参数是一个标志,指示是否应同时返回请求/响应的正文。
```
package main
import (
"fmt"
"log"
"net/http"
"net/http/httputil"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
)
func main() {
edgerc, err := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
client := http.Client{}
req, err := http.NewRequest(http.MethodGet, "/identity-management/v3/user-profile", nil)
if err != nil {
log.Fatal(err)
}
req.Header.Add("Accept", "application/json")
edgerc.SignRequest(req)
reqDump, err := httputil.DumpRequestOut(req, false)
if err != nil {
log.Fatal(err)
}
fmt.Printf("REQUEST:\n%s", string(reqDump))
res, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
resDump, err := httputil.DumpResponse(res, true)
if err != nil {
log.Fatal(err)
}
fmt.Printf("RESPONSE:\n%s", string(resDump))
}
```
## 与 `session` 结合使用
当使用 [auth signer 方法](#use-as-an-auth-signer) 进行调用时,您可以添加 `session` 包来记录有关该调用的附加信息。您还可以在该调用中将请求对象的 `struct` 定义为变量,或者您可以省略 `struct` 并使用 `any` 关键字将请求对象定义为 any 类型的变量。
```
package main
import (
"fmt"
"net/http"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/session"
)
func main() {
edgerc, _ := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
sess, err := session.New(
session.WithSigner(edgerc),
)
if err != nil {
fmt.Println(err)
return
}
var userProfile struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
UserName string `json:"uiUserName"`
TimeZone string `json:"timeZone"`
Country string `json:"country"`
PreferredLanguage string `json:"preferredLanguage"`
SessionTimeOut *int `json:"sessionTimeOut"`
}
req, err := http.NewRequest(http.MethodGet, "/identity-management/v3/user-profile", nil)
if err != nil {
fmt.Println(err)
return
}
result, err := sess.Exec(req, &userProfile)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(result, userProfile)
}
```
`session` 包还支持来自 `github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/log` 的结构化日志接口。得益于此,您可以通过以下方式之一调整 logger(例如,将日志级别更改为 `Debug`):
- 使用 `log.SetLogger()` 方法全局应用 logger,以便在所有 session 中使用它。您可以使用 `log.FromContext()` 方法从 `context` 中检索 logger。
package main
import (
"fmt"
"log/slog"
"net/http"
"os"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/log"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/session"
)
func main() {
edgerc, _ := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
l := log.NewSlogAdapter(log.NewSlogHandler(os.Stderr, &slog.HandlerOptions{
Level: slog.LevelDebug,
}))
log.SetLogger(l)
sess, _ := session.New(
session.WithSigner(edgerc),
session.WithHTTPTracing(true),
)
var userProfile struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
UserName string `json:"uiUserName"`
TimeZone string `json:"timeZone"`
Country string `json:"country"`
PreferredLanguage string `json:"preferredLanguage"`
SessionTimeOut *int `json:"sessionTimeOut"`
}
req, _ := http.NewRequest(http.MethodGet, "/identity-management/v3/user-profile", nil)
result, err := sess.Exec(req, &userProfile)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(result, userProfile)
}
- 使用 `session.WithLog()` 方法将 logger 应用于 session 中的所有操作。
package main
import (
"fmt"
"log/slog"
"net/http"
"os"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/log"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/session"
)
func main() {
edgerc, _ := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
l := log.NewSlogAdapter(log.NewSlogHandler(os.Stderr, &slog.HandlerOptions{
Level: slog.LevelDebug,
}))
sess, _ := session.New(
session.WithSigner(edgerc),
session.WithLog(l),
session.WithHTTPTracing(true),
)
var userProfile struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
UserName string `json:"uiUserName"`
TimeZone string `json:"timeZone"`
Country string `json:"country"`
PreferredLanguage string `json:"preferredLanguage"`
SessionTimeOut *int `json:"sessionTimeOut"`
}
req, _ := http.NewRequest(http.MethodGet, "/identity-management/v3/user-profile", nil)
result, err := sess.Exec(req, &userProfile)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(result, userProfile)
}
- 使用 `req.WithContext()` 方法覆盖特定请求的默认 logger。
package main
import (
"fmt"
"log/slog"
"net/http"
"os"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/log"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/session"
)
func main() {
edgerc, _ := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
l := log.NewSlogAdapter(log.NewSlogHandler(os.Stderr, &slog.HandlerOptions{
Level: slog.LevelDebug,
}))
sess, _ := session.New(
session.WithSigner(edgerc),
session.WithHTTPTracing(true),
)
var userProfile struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
UserName string `json:"uiUserName"`
TimeZone string `json:"timeZone"`
Country string `json:"country"`
PreferredLanguage string `json:"preferredLanguage"`
SessionTimeOut *int `json:"sessionTimeOut"`
}
req, _ := http.NewRequest(http.MethodGet, "/identity-management/v3/user-profile", nil)
req = req.WithContext(session.ContextWithOptions(req.Context(), session.WithContextLog(l)))
result, err := sess.Exec(req, &userProfile)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(result, userProfile)
}
如果您没有提供自定义 logger,该库将使用 `session.New()` 方法中包含的默认 logger。
您也可以创建自己的自定义 logger。有关更多详细信息和示例,请参阅 [logger README](pkg/log/README.md)。
在添加结构化日志接口的所有这些方式中,您都需要 `session.WithHTTPTracing` 选项。这是为了记录所有请求、响应及其标头。它还要求至少为 `Debug` 日志级别。
### 自定义请求标头
当将 `session` 包与 [auth signer 方法](#use-as-an-auth-signer) 一起使用时,您可以更新 context 以在 `session.WithContextHeaders()` 方法中传递自定义请求标头。
```
package main
import (
"fmt"
"net/http"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/session"
)
func main() {
edgerc, _ := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
sess, _ := session.New(
session.WithSigner(edgerc),
)
var userProfile struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
UserName string `json:"uiUserName"`
TimeZone string `json:"timeZone"`
Country string `json:"country"`
PreferredLanguage string `json:"preferredLanguage"`
SessionTimeOut *int `json:"sessionTimeOut"`
}
req, _ := http.NewRequest(http.MethodGet, "/identity-management/v3/user-profile", nil)
customHeader := make(http.Header)
customHeader.Set("X-Custom-Header", "some custom value")
req = req.WithContext(session.ContextWithOptions(req.Context(), session.WithContextHeaders(customHeader)))
result, err := sess.Exec(req, &userProfile)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(result, userProfile)
}
```
### 重试
使用 `session` 包,您可以使用 `session.WithRetries()` 选项来创建具有全局 GET 重试功能的新 session。您可以使用其默认配置来设置此选项,或者使用以下参数对其进行自定义:
- `RetryMax`。API 请求重试的最大次数。
- `RetryWaitMin`。API 请求重试之间以 `time.Duration` 表示的最短等待时间。
- `RetryWaitMax`。API 请求重试之间以 `time.Duration` 表示的最长等待时间。
- `ExcludedEndpoints`。定义应从重试功能中排除的 endpoint 的路径表达式列表。
```
package main
import (
"fmt"
"net/http"
"time"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/session"
)
func main() {
edgerc, _ := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
// The retries feature with default configuration.
sess, err := session.New(
session.WithSigner(edgerc),
session.WithRetries(session.NewRetryConfig()),
)
// The retries feature with custom configuration.
sess, err := session.New(
session.WithSigner(edgerc),
session.WithRetries(session.RetryConfig{
RetryMax: 5,
RetryWaitMax: time.Minute * 2,
RetryWaitMin: time.Second * 3,
}),
)
if err != nil {
fmt.Println(err)
return
}
var userProfile struct {
FirstName string `json:"firstName"`
LastName string `json:"lastName"`
UserName string `json:"uiUserName"`
TimeZone string `json:"timeZone"`
Country string `json:"country"`
PreferredLanguage string `json:"preferredLanguage"`
SessionTimeOut *int `json:"sessionTimeOut"`
}
req, err := http.NewRequest(http.MethodGet, "/identity-management/v3/user-profile", nil)
if err != nil {
fmt.Println(err)
return
}
result, err := sess.Exec(req, &userProfile)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(result, userProfile)
}
```
## 用作 SDK
除了使用 `edgegrid` 包对请求进行签名之外,您还可以使用该库中的特定 API 客户端和方法。
### 包概述
要查看在给定包中可以使用哪些方法,请转到 `pkg` 目录并选择包名称。每个包包含:
- 一个以包名称或包的缩写命名的文件,带有主 `interface`。
- 主 `interface` 可以包含其自身的方法或其他具有各自方法的 `interfaces`。
- 分布在包文件中的 `struct`块,每个块包含您可以在给定方法中传递的参数列表。
| Package | Description |
|------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| [Account Protector](./pkg/accountprotection) | 检测并缓解可能导致账户接管和其他滥用行为的非真实用户行为。 |
| [API Definitions](./pkg/apidefinitions) | 注册并定义 API endpoint 约束,用于在其他 Akamai 产品和服务中设置保护时使用。 |
| [Application Security](./pkg/appsec/) | 管理安全配置、安全策略、匹配目标、速率策略和防火墙规则。 |
| [Bot Manager](./pkg/botman/) | 识别、跟踪和响应您域中或应用中的机器人活动。 |
| [Certificate Provisioning System](./pkg/cps/) | 管理您的 Akamai CDN 应用程序的 SSL 证书的整个生命周期。 |
| [Client Lists](./pkg/clientlists/) | 通过仅允许受信任的 IP/CIDR、位置、自治系统编号和 TLS 指纹访问您的服务和内容,来减少有害的安全攻击。 |
| [Cloud Access Manager](./pkg/cloudaccess/) | 启用云源站身份验证,并以访问密钥的形式安全地存储和管理您的云源站凭据。 |
| [Cloud Certificate Manager](./pkg/ccm/) | 存储和管理第三方证书,无需复杂的网络部署设置。 |
| [Cloudlets](./pkg/cloudlets/) | 使用补充 Akamai 核心解决方案的增值应用来解决特定的业务挑战。 |
| [Cloud Wrapper](./pkg/cloudwrapper/) | 通过添加自定义缓存层来改善您的云基础设施与 Akamai 平台之间的连接,从而为您的客户提供更加一致的用户体验。 |
| [DataStream](./pkg/datastream/) | 监控 Akamai 平台上的活动,并将实时日志数据发送到您选择的目的地。 |
| [Domain Ownership Manager](./pkg/domainownership/) | 在激活您的属性配置之前,证明您接入到 Akamai 的新域的所有权。 |
| [Edge DNS](./pkg/dns/) | 使用基于云的权威 DNS 解决方案替换或增强您的 DNS 基础设施。 |
| [EdgeGrid](./pkg/edgegrid/) | 解析 Akamai `.edgerc` 配置并对 HTTP 请求进行签名。 |
| [EdgeGrid Errors](./pkg/edgegriderr/) | 解析验证错误以使其更具可读性。 |
| [Edge Hostnames](./pkg/hapi/) | 管理您的站点、应用或内容的请求如何映射到 Akamai 边缘服务器。 |
| [EdgeWorkers](./pkg/edgeworkers/) | 在边缘执行 JavaScript 函数以优化站点性能并自定义 Web 体验。 |
| [Errors](./pkg/errs/) | 使用用于在 JSON 数据 unmarshal 期间处理错误的实用工具。 |
| [Global Traffic Management](./pkg/gtm/) | 使用负载均衡来管理网站和移动性能需求。 |
| [Identity and Access Management](./pkg/iam/) | 创建用户和组,并定义管理对您的 Akamai 应用程序访问权限的策略。 |
| [Image and Video Manager](./pkg/imaging/) | 为您的网站访问者自动化图像和视频交付优化。 |
| [Log](./pkg/log/) | 添加结构化日志接口。 |
| [mTLS Origin Keystore](./pkg/mtlskeystore/) | 安全地管理客户端证书,以在 Akamai 边缘服务器和源站之间建立双向身份验证 (mTLS) session。 |
| [mTLS Edge Truststore](./pkg/mtlstruststore) | 管理存储受信任 CA 证书的证书颁发机构 (CA) 集,从而实现客户端和 Akamai 边缘服务器之间安全的双向身份验证 (mTLS)。 |
| [Network Lists](./pkg/networklists/) | 自动化用于 Akamai 安全产品的列表的创建、部署和管理。 |
| [Pointer Record](./pkg/ptr/) | 创建指向任何类型值的指针。 |
| [Property Manager](./pkg/papi/) | 定义基于匹配条件来管理您网站交付的规则和行为。 |
| [Reporting Groups](./pkg/reportinggroups/) | 通过报告组而不是仅通过合同或产品来细分您的发票和有关站点流量的报告。 |
| [Session](./pkg/session/) | 管理用于 Akamai API 的基础安全 HTTP 客户端和请求。 |
### 示例
要将该库用作 SDK,请导入 `edgegrid` 包来对您的请求进行签名,导入 `session` 包,以及导入该库中可用的特定包(例如 `iam`),以使用该包中包含的方法。提供您的 `.edgerc` 路径、您的凭据部分标题,并参考特定的 API 客户端和方法。
```
package main
import (
"context"
"fmt"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/iam"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/session"
)
func main() {
edgerc, err := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
if err != nil {
fmt.Println(err)
return
}
sess, err := session.New(
session.WithSigner(edgerc),
)
if err != nil {
fmt.Println(err)
return
}
client := iam.Client(sess)
resp, err := client.GetUser(context.TODO(), iam.GetUserRequest{IdentityID: "A-BC-1234567"})
if err != nil {
fmt.Println(err)
return
}
fmt.Println(resp)
}
```
### 标头
您不需要向请求添加任何必需或可选的标头。身份验证层会自动为您添加这些值。
### 查询字符串参数和正文数据
根据方法类型,使用提供的 API `struct` 中的 `structs` 在请求方法中传递查询参数和正文数据。
```
package main
import (
"context"
"fmt"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/edgegrid"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/iam"
"github.com/akamai/AkamaiOPEN-edgegrid-golang/v13/pkg/session"
)
func main() {
edgerc, err := edgegrid.New(
edgegrid.WithFile("~/.edgerc"),
edgegrid.WithSection("default"),
)
if err != nil {
fmt.Println(err)
return
}
sess, err := session.New(
session.WithSigner(edgerc),
)
if err != nil {
fmt.Println(err)
return
}
client := iam.Client(sess)
sessTimeOut := 14400
resp, err := client.UpdateUserInfo(
context.TODO(),
iam.UpdateUserInfoRequest{
IdentityID: "A-BC-123456",
User: iam.UserBasicInfo{
Country: "USA",
FirstName: "John",
LastName: "Smith",
Phone: "3456788765",
PreferredLanguage: "English",
SessionTimeOut: &sessTimeOut,
TimeZone: "GMT",
},
},
)
if err != nil {
fmt.Println(err)
return
}
fmt.Println(resp)
}
```
## 报告问题
要报告问题或提出建议,请创建一个新的 [GitHub issue](https://github.com/akamai/AkamaiOPEN-edgegrid-golang/issues)。
## 许可证
Copyright 2026 Akamai Technologies, Inc. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use these files except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
标签:Akamai, API认证, ECS, EdgeGrid, EVTX分析, Go, Retryablehttp, Ruby工具, Terraform, 开发工具库, 日志审计