You need to enable JavaScript to run this app.
导航
C++ 使用示例
最近更新时间:2025.04.09 15:17:28首次发布时间:2025.04.09 15:17:28
我的收藏
有用
有用
无用
无用

本文为您介绍大模型应用防火墙 C++ SDK 的安装方式和代码示例,帮助您快速了解如何使用 SDK 调用 OpenAPI。

前提条件

环境要求

安装 gcc 或其他 C 语言编译器。执行gcc --version可以检查当前 gcc 的版本信息。

步骤一 下载依赖库

代码示例中使用了libcurljson-copenssl 等依赖库,您需要安装这些库及其开发包。以Debian/Ubuntu 系统为例,您可以使用如下命令安装:

libcurl用于发起 HTTP 请求,安装命令如下:

sudo apt install libcurl4-openssl-dev

步骤二 生成静态库

为确保兼容性,您需要根据目标运行环境编译静态库。

  1. 获取头文件和源文件。

    头文件api_request.h的具体内容如下:

    #ifndef API_REQUEST_H
    #define API_REQUEST_H
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <curl/curl.h>
    #include <json-c/json.h>
    #include <openssl/sha.h>
    #include <openssl/hmac.h>
    
    #define MAX_LEN 40960
    #define DATE_FORMAT "%Y%m%dT%H%M%SZ"
    
    // 定义常量,实际使用时请替换为真实值
    extern const char *AccessKeyID;
    extern const char *SecretAccessKey;
    extern const char *Region;
    extern const char *Service;
    extern const char *Endpoint;
    extern const char *Action;
    extern const char *Version;
    extern const char *Content;
    
    // 回调函数,用于处理请求头
    size_t request_header_callback(void *ptr, size_t size, size_t nmemb, void *userdata);
    
    // 回调函数,用于处理请求体
    size_t request_body_callback(void *ptr, size_t size, size_t nmemb, void *userdata);
    
    // 回调函数,用于处理响应头
    size_t response_header_callback(void *ptr, size_t size, size_t nmemb, void *userdata);
    
    // 回调函数,用于处理响应体
    size_t response_body_callback(void *ptr, size_t size, size_t nmemb, void *userdata);
    
    // HMAC - SHA256计算
    unsigned char *hmacSHA256(const unsigned char *key, size_t key_len, const unsigned char *content, size_t content_len);
    
    // 获取签名密钥
    unsigned char *getSignedKey(const char *secretKey, const char *date, const char *region, const char *service);
    
    // SHA256哈希计算
    char *hashSHA256(const unsigned char *content, size_t len);
    
    // 构建规范字符串
    void buildCanonicalString(const char *method, const char *queryString, const char *host, const char *date, const char *payload, char *canonicalString);
    
    // 构建签名字符串
    void buildSignString(const char *date, const char *authDate, const char *hashedCanonicalString, char *signString);
    
    // 构建认证请求头
    void buildAuthorization(const char *authDate, const char *signString, char *authorization);
    
    // 构建请求体JSON字符串
    void buildCheckLLMPromptBody(const char *content, int contentType, const char *host, int msgClass, const char *region, char *requestBody);
    
    // 构建请求体JSON字符串
    void buildQueryLLMGenerateBody(const char *msgid, int useStream , char *requestBody);
    
    // 执行curl请求
    int performCurlRequest(CURL *curl, const char *url, const char *requestBody, struct curl_slist *headers);
    
    // 初始化curl相关设置
    CURL *initCurl();
    
    // 构建请求地址
    void buildRequestAddress(const char *endpoint, const char *queryString, char *requestAddr, size_t size);
    
    // 构建查询字符串
    void buildQueryString(const char *action, const char *version, char *queryString, size_t size);
    
    // 构建签名相关材料
    void buildSignatureMaterials(char *date, char *authDate, const char *requestBody, char *payload, size_t payloadSize);
    
    #endif    
    
  2. 使用以下命令编译成libapi_request.a静态库:

    gcc -c api_request.c -o api_request.o -lcurl -ljson-c -lssl -lcrypto
    ar rcs libapi_request.a api_request.o   
    

步骤三 调用接口

以下提供调用CheckLLMPrompt判别大模型提示词是否合规的示例代码,实际使用时,您可以替换成 SDK 中已经支持的任意接口。CheckLLMPrompt相关参数的详细说明,可参考CheckLLMPrompt - 判别大模型提示词是否合规

#include "api_request.h"

// 定义常量,实际使用时请替换为真实值
const char *AccessKeyID = "Your AK";
const char *SecretAccessKey = "Your SK";
const char *Region = "cn-beijing";
const char *Service = "waf";
const char *Endpoint = "open.volcengineapi.com";
const char *Action = "CheckLLMPrompt";
const char *Version = "2023-12-25";
const char *Content = "请输入您想要校验的内容,文本内容或资源URL";

int main()
{
    CURL *curl;
    CURLcode res;
    struct curl_slist *headers = NULL;
    char queryString[MAX_LEN] = {0};
    char requestAddr[MAX_LEN] = {0};
    char date[64] = {0};
    char authDate[9] = {0};
    char payload[MAX_LEN] = {0};
    char canonicalString[MAX_LEN * 2] = {0};
    char hashedCanonicalString[MAX_LEN] = {0};
    char signString[MAX_LEN * 2] = {0};
    char authorization[MAX_LEN] = {0};
    char requestBody[MAX_LEN] = {0};
    char x_date_header[MAX_LEN] = {0};
    char x_content_sha256_header[MAX_LEN] = {0};

    // 构建签名材料
    time_t now = time(NULL);
    struct tm *tm_info = gmtime(&now);
    if (strftime(date, sizeof(date), DATE_FORMAT, tm_info) == 0)
    {
        fprintf(stderr, "Failed to format date\n");
        return 1;
    }

    strncpy(authDate, date, 8);
    authDate[8] = '\0';

    // 构建请求体
    buildRequestBody(Content, 1, "example.com", 0, Region, requestBody);

    // 构建查询字符串
    buildQueryString(Action, Version, queryString, MAX_LEN);

    // 构建请求地址
    buildRequestAddress(Endpoint, queryString, requestAddr, MAX_LEN);

    // 构建签名相关材料
    buildSignatureMaterials(date, authDate, requestBody, payload, MAX_LEN);

    // 构建规范字符串
    buildCanonicalString("POST", queryString, Endpoint, date, payload, canonicalString);

    strcpy(hashedCanonicalString, hashSHA256((const unsigned char *)canonicalString, strlen(canonicalString)));

    // 构建签名字符串
    buildSignString(date, authDate, hashedCanonicalString, signString);

    // 构建认证请求头
    buildAuthorization(authDate, signString, authorization);

    // 初始化libcurl
    curl = initCurl();
    if (curl)
    {
        // 设置请求头
        headers = curl_slist_append(headers, "Content-Type: application/json");
        if (snprintf(x_date_header, MAX_LEN, "X-Date: %s", date) >= MAX_LEN)
        {
            fprintf(stderr, "x_date_header buffer overflow\n");
            curl_slist_free_all(headers);
            curl_easy_cleanup(curl);
            return 1;
        }
        headers = curl_slist_append(headers, x_date_header);

        if (snprintf(x_content_sha256_header, MAX_LEN, "X-Content-Sha256: %s", payload) >= MAX_LEN)
        {
            fprintf(stderr, "x_content_sha256_header buffer overflow\n");
            curl_slist_free_all(headers);
            curl_easy_cleanup(curl);
            return 1;
        }
        headers = curl_slist_append(headers, x_content_sha256_header);

        char Authorization[4096] = {0};
        sprintf(Authorization, "Authorization: %s", authorization);
        headers = curl_slist_append(headers, Authorization);
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        // 执行请求
        res = performCurlRequest(curl, requestAddr, requestBody, headers);

        // 清理请求头列表
        curl_slist_free_all(headers);

        // 清理libcurl句柄
        curl_easy_cleanup(curl);
    }

    return 0;
}