火山引擎向量数据库 VikingDB 支持通过 API 接口进行操作,在使用 API 接口前,需先做好以下准备工作。
通过 注册账号及开通服务 页面操作,完成注册账号及开通服务。
在调用火山引擎向量数据库 VikingDB 的各个能力之前,确保您已生成访问密钥 Access Key。
Access Key 包括 Access Key ID(简称为 AK) 和 Access Key Secret(简称为 SK)。其中,AK用于标识用户,SK用于验证用户的密钥,请您妥善保管。
AK/SK 密钥获取方式如下,更多详情请参考 Access Key(密钥)管理。
注意
安全起见,建议新建子账户,并使用子账户的 AK/SK。
签名是 API 请求中的一串经过计算得到的编码字符串,它用于身份认证和防止数据被篡改。
签名不像ak、sk,每个请求的签名都是独立且临时的,一个签名只能用于一次特定的请求,不能长期固定使用。
签名由签名生成函数prepare_request基于以下这些参数计算而来:
参数 | 作用 |
---|---|
method(请求方法) | 影响签名计算,例如 GET、POST |
path(API 请求路径) | 例如 "/api/collection/create" |
ak(Access Key) | 标识 API 调用者 |
sk(Secret Key) | 用于 HMAC-SHA256 计算签名(需保密) |
params(查询参数) | 适用于 GET 请求等 |
data(请求体) | 适用于 POST、PUT 请求 |
doseq(查询参数的格式控制) | 影响 params 的格式 |
签名生成函数prepare_request的具体代码就在本文第四小节 “4. 签名生成函数(prepare_request)” 中。
在本文第四小节 “4. 多种语言的签名生成函数(prepare request)” 中,我们提供了多种语言的 prepare_request 签名生成代码。此处以 Python 版本为例,演示如何用prepare_request函数生成签名,并创建数据集。
pip install volcengine
,安装火山引擎程序包;# volc_auth.py import json import sys from volcengine.auth.SignerV4 import SignerV4 from volcengine.base.Request import Request from volcengine.Credentials import Credentials def prepare_request(method, path, ak, sk, params=None, data=None, doseq=0): if params: for key in params: if ( type(params[key]) == int or type(params[key]) == float or type(params[key]) == bool ): params[key] = str(params[key]) elif sys.version_info[0] != 3: if type(params[key]) == unicode: params[key] = params[key].encode("utf-8") elif type(params[key]) == list: if not doseq: params[key] = ",".join(params[key]) r = Request() r.set_shema("https") r.set_method(method) r.set_connection_timeout(10) r.set_socket_timeout(10) mheaders = { "Accept": "application/json", "Content-Type": "application/json", "Host": "api-vikingdb.volces.com", } r.set_headers(mheaders) if params: r.set_query(params) r.set_host("api-vikingdb.volces.com") r.set_path(path) if data is not None: r.set_body(json.dumps(data)) # 生成签名 credentials = Credentials(ak, sk, "air", "cn-north-1") SignerV4.sign(r, credentials) return r
import requests from volc_auth import prepare_request # 此处就导入了volc_auth.py中的签名生成函数prepare_request AK = "此处填写您的ak,注意保留双引号" SK = "此处填写您的sk,注意保留双引号" DOMAIN = "api-vikingdb.volces.com" # 创建 Collection request_params = { "collection_name": "your_collection", "description": "这是一个用例,展示如何使用prepare_request函数生成签名,并操作VikingDB创建数据集", # 声明主键 "primary_key": "id", # 定义声明各个字段 "fields": [ { "field_name": "id", "field_type": "int64", "default_val": 0, }, {"field_name": "vector_field", "field_type": "vector", "dim": 64} # 其他字段已省略 ], } # 调用 prepare_request 生成请求并完成签名 info_collection_req = prepare_request( method="POST", path="/api/collection/create", ak=AK, sk=SK, data=request_params, ) # 完成请求 r = requests.request( method=info_collection_req.method, url="https://{}{}".format(DOMAIN, info_collection_req.path), headers=info_collection_req.headers, params=info_collection_req.query, data=info_collection_req.body, ) # 打印请求结果 print(r.text)
以下有Python、GO、Java、Node.js这几种语言的签名生成函数,供您参考。
安装火山引擎程序包。
pip install volcengine
生成签名。
# volc_auth.py import json import sys from volcengine.auth.SignerV4 import SignerV4 from volcengine.base.Request import Request from volcengine.Credentials import Credentials def prepare_request(method, path, ak, sk, params=None, data=None, doseq=0): if params: for key in params: if ( type(params[key]) == int or type(params[key]) == float or type(params[key]) == bool ): params[key] = str(params[key]) elif sys.version_info[0] != 3: if type(params[key]) == unicode: params[key] = params[key].encode("utf-8") elif type(params[key]) == list: if not doseq: params[key] = ",".join(params[key]) r = Request() r.set_shema("https") r.set_method(method) r.set_connection_timeout(10) r.set_socket_timeout(10) mheaders = { "Accept": "application/json", "Content-Type": "application/json", "Host": "api-vikingdb.volces.com", } r.set_headers(mheaders) if params: r.set_query(params) r.set_host("api-vikingdb.volces.com") r.set_path(path) if data is not None: r.set_body(json.dumps(data)) # 生成签名 credentials = Credentials(ak, sk, "air", "cn-north-1") SignerV4.sign(r, credentials) return r
安装火山引擎程序包。
go get -u github.com/volcengine/volc-sdk-golang
生成签名。
package main import ( "bytes" "fmt" "net/http" "net/url" "strings" "io/ioutil" "github.com/volcengine/volc-sdk-golang/base" ) const ( testAk = "***" testSk = "***" ) func PrepareRequest(method string, path string, ak string, sk string, query url.Values, body []byte) *http.Request { u := url.URL{ Scheme: "https", Host: "api-vikingdb.volces.com", Path: path, } if query != nil { u.RawQuery = query.Encode() } req, _ := http.NewRequest(strings.ToUpper(method), u.String(), bytes.NewReader(body)) req.Header.Add("Accept", "application/json") req.Header.Add("Content-Type", "application/json") req.Header.Add("Host", "api-vikingdb.volces.com") credential := base.Credentials{ AccessKeyID: ak, SecretAccessKey: sk, Service: "air", Region: "cn-north-1", } req = credential.Sign(req) return req } func main() { body := []byte(`{"collection_name":"test_no_vector_collection"}`) req := PrepareRequest("GET", "/api/collection/info", testAk, testSk, nil, body) fmt.Printf("%+v\n", req) // 发送请求 client := &http.Client{} resp, err := client.Do(req) if err != nil { fmt.Println("Error sending request:", err) return } defer resp.Body.Close() rb, _ := ioutil.ReadAll(resp.Body) fmt.Println(string(rb)) }
<dependency> <groupId>com.volcengine</groupId> <artifactId>volc-sdk-java</artifactId> <version>最新版本</version> </dependency>
“最新版本”的版本号可以在GitHub 仓库的 README 文件的 “获取与安装” 部分找到,如右图所示。
将版本号代码,直接贴进
package javaTest; import java.util.List; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import com.volcengine.auth.ISignerV4; import com.volcengine.auth.impl.SignerV4Impl; import com.volcengine.model.Credentials; import com.volcengine.service.SignableRequest; public class sign { public static SignableRequest prepareRequest(String host, String path, String method, List<NameValuePair> params, String body, String ak, String sk) throws Exception { SignableRequest request = new SignableRequest(); request.setMethod(method); request.setHeader("Accept", "application/json"); request.setHeader("Content-Type", "application/json"); request.setHeader("Host", host); request.setEntity(new StringEntity(body, "utf-8")); URIBuilder builder = request.getUriBuilder(); builder.setScheme("https"); builder.setHost(host); builder.setPath(path); if (params != null) { builder.setParameters(params); } RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(5000).setConnectTimeout(2000).build(); request.setConfig(requestConfig); Credentials credentials = new Credentials("cn-north-1", "air"); credentials.setAccessKeyID(ak); credentials.setSecretAccessKey(sk); // 签名 ISignerV4 ISigner = new SignerV4Impl(); ISigner.sign(request, credentials); return request; } public static void main(String[] args) throws Exception { String host = "api-vikingdb.volces.com"; String path = "/api/collection/info"; String method = "GET"; String query = "collection_name = test_collection"; String body = null; String ak = "your_ak_on_volcengine"; // 替换为您的 Access Key String sk ="your_sk_on_volcengine"; // 替换为您的 Secret Key SignableRequest request = prepareRequest(host, path, method, null, body, ak, sk); System.out.println(request.getURI()); HttpClient client = HttpClients.createDefault(); HttpResponse response = client.execute(request); int statusCode = response.getStatusLine().getStatusCode(); String content = EntityUtils.toString(response.getEntity()); System.out.println(statusCode); System.out.println(content); } }
pnpm add @volcengine/openapi
import { Signer } from '@volcengine/openapi'; import type { RequestObj } from '@volcengine/openapi/lib/base/types'; interface Options { pathname: string method: 'GET' | 'POST' body?: string // json 字符串,当且仅当 post 请求 region: 'cn-beijing' | 'cn-shanghai' params?: Record<string, any> // 当且仅当 get 请求 } function signer({ pathname, method, body, region, params }: Options) { const requestObj: RequestObj = { region, headers: { Accept: 'application/json', 'Content-Type': 'application/json' }, method, body, pathname, params, } const signer = new Signer(requestObj, 'air') signer.addAuthorization({ accessKeyId: 'ak', // 替换为用户 ak secretKey: 'sk', // 替换为用户 sk }) return requestObj.headers }
调用函数 signer
生成请求体 header 后,将生成好的 header 注入到用户请求函数中。
签名过程说明详情请参考 签名过程Demo,通过源码生成签名详情请参考 签名源码示例,通过 SDK 生成签名详情请参考 SDK概览。