豆包生成C即梦API HTTP调用实例代码

豆包生成C即梦API HTTP调用实例代码

using Newtonsoft.Json; using System.Security.Cryptography; using System.Text; internal class VolcengineApiClient { private readonly string _accessKey; private readonly string _secretKey; private readonly string _host; private readonly string _region; private readonly string _service; private readonly string _endpoint; private readonly HttpClient _httpClient; /// <summary> /// 初始化火山引擎API客户端 /// </summary> /// <param name="accessKey">访问密钥</param> /// <param name="secretKey">密钥</param> /// <param name="host">API主机地址</param> /// <param name="region">区域</param> /// <param name="service">服务名称</param> public VolcengineApiClient(string accessKey, string secretKey, string host = "visual.volcengineapi.com", string region = "cn-north-1", string service = "cv") { _accessKey = accessKey ?? throw new ArgumentNullException(nameof(accessKey)); _secretKey = secretKey ?? throw new ArgumentNullException(nameof(secretKey)); _host = host ?? throw new ArgumentNullException(nameof(host)); _region = region ?? throw new ArgumentNullException(nameof(region)); _service = service ?? throw new ArgumentNullException(nameof(service)); _endpoint = $"https://{_host}"; _httpClient = new HttpClient(); } /// <summary> /// 发送API请求 /// </summary> /// <param name="method">HTTP方法</param> /// <param name="action">API动作</param> /// <param name="version">API版本</param> /// <param name="bodyParams">请求体参数</param> /// <param name="extraQueryParams">额外的查询参数</param> /// <returns>响应结果</returns> public async Task<string> SendRequestAsync(string method = "POST", string action = "CVProcess", string version = "2022-08-31", object bodyParams = null, Dictionary<string, string> extraQueryParams = null) { // 准备查询参数 var queryParams = new Dictionary<string, string> { {"Action", action}, {"Version", version} }; // 添加额外的查询参数 if (extraQueryParams != null) { foreach (var param in extraQueryParams) { queryParams[param.Key] = param.Value; } } // 格式化查询参数 string formattedQuery = FormatQueryParameters(queryParams); // 准备请求体 string formattedBody = bodyParams != null ? JsonConvert.SerializeObject(bodyParams) : "{}"; // 生成时间戳 DateTime utcNow = DateTime.UtcNow; string currentDate = utcNow.ToString("yyyyMMddTHHmmssZ"); string dateStamp = utcNow.ToString("yyyyMMdd"); // 计算 payload hash string payloadHash = ComputeSha256Hash(formattedBody); // 构建规范请求 string canonicalUri = "/"; string contentType = "application/json"; string canonicalHeaders = $"content-type:{contentType} " + $"host:{_host} " + $"x-content-sha256:{payloadHash} " + $"x-date:{currentDate} "; string signedHeaders = "content-type;host;x-content-sha256;x-date"; string canonicalRequest = $"{method} {canonicalUri} {formattedQuery} {canonicalHeaders} {signedHeaders} {payloadHash}"; // 计算签名 string algorithm = "HMAC-SHA256"; string credentialScope = $"{dateStamp}/{_region}/{_service}/request"; string stringToSign = $"{algorithm} {currentDate} {credentialScope} {ComputeSha256Hash(canonicalRequest)}"; byte[] signingKey = GetSignatureKey(_secretKey, dateStamp, _region, _service); string signature = ComputeHmacSha256(signingKey, stringToSign); // 构建授权头 string authorizationHeader = $"{algorithm} Credential={_accessKey}/{credentialScope}, " + $"SignedHeaders={signedHeaders}, " + $"Signature={signature}"; // 准备请求头 var headers = new Dictionary<string, string> { {"X-Date", currentDate}, {"Authorization", authorizationHeader}, {"X-Content-Sha256", payloadHash}, {"Content-Type", contentType} }; // 构建请求URL string requestUrl = $"{_endpoint}?{formattedQuery}"; Console.WriteLine(" BEGIN REQUEST+++++++++++++++++++++++++++++++++++即梦Ai 教程+"); Console.WriteLine($"Request URL = {requestUrl}"); // 发送请求  HttpResponseMessage response; try { using (var request = new HttpRequestMessage(new HttpMethod(method), requestUrl)) { // 添加请求头 foreach (var header in headers) { request.Headers.TryAddWithoutValidation(header.Key, header.Value); } // 添加请求体 if (method.Equals("POST", StringComparison.OrdinalIgnoreCase) && !string.IsNullOrEmpty(formattedBody)) { request.Content = new StringContent(formattedBody, new System.Net.Http.Headers.MediaTypeHeaderValue(contentType)); } response = await _httpClient.SendAsync(request); } string responseBody = await response.Content.ReadAsStringAsync(); Console.WriteLine(" RESPONSE++++++++++++++++++++++++++++++++++++"); Console.WriteLine($"Response code: {(int)response.StatusCode}"); Console.WriteLine($"Response body: {responseBody.Replace("\u0026", "&")} "); return responseBody; } catch (Exception ex) { Console.WriteLine($"Error occurred: {ex.Message}"); throw; } } /// <summary> /// 格式化查询参数 /// </summary> private string FormatQueryParameters(Dictionary<string, string> parameters) ={p.Value}")); } /// <summary> /// 计算SHA256哈希 /// </summary> private string ComputeSha256Hash(string input) { // 创建SHA256实例 using (SHA256 sha256Hash = SHA256.Create()) { // 将输入字符串转换为UTF8字节数组 byte[] inputBytes = Encoding.UTF8.GetBytes(input); // 计算哈希值 byte[] hashBytes = sha256Hash.ComputeHash(inputBytes); // 将字节数组转换为十六进制字符串 StringBuilder builder = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) { builder.Append(hashBytes[i].ToString("x2")); // "x2"确保每个字节用两位十六进制表示  } return builder.ToString(); } } /// <summary> /// 计算HMAC-SHA256 /// </summary> private string ComputeHmacSha256(byte[] key, string input) { using (HMACSHA256 hmac = new HMACSHA256(key)) { byte[] hashBytes = hmac.ComputeHash(Encoding.UTF8.GetBytes(input)); return BitConverter.ToString(hashBytes).Replace("-", "").ToLower(); } } /// <summary> /// 获取签名密钥 /// </summary> private byte[] GetSignatureKey(string key, string dateStamp, string regionName, string serviceName) { byte[] kDate = ComputeHmacSha256Bytes(Encoding.UTF8.GetBytes(key), dateStamp); byte[] kRegion = ComputeHmacSha256Bytes(kDate, regionName); byte[] kService = ComputeHmacSha256Bytes(kRegion, serviceName); return ComputeHmacSha256Bytes(kService, "request"); } /// <summary> /// 计算HMAC-SHA256字节数组 /// </summary> private byte[] ComputeHmacSha256Bytes(byte[] key, string input) { using (HMACSHA256 hmac = new HMACSHA256(key)) { return hmac.ComputeHash(Encoding.UTF8.GetBytes(input)); } } }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/257919.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月13日 上午9:43
下一篇 2026年3月13日 上午9:44


相关推荐

关注全栈程序员社区公众号