开发者社区 问答 正文

data agent 集成 到我的程序

工单:DMS Data Agent Java SDK GetChatContent API 签名错误

问题描述

使用 alibabacloud-dms20250414 SDK (v1.0.4) 调用 GetChatContent API 时出现签名相关错误,但其他 API(CreateDataAgentSession、SendChatMessage、DescribeDataAgentSession)均正常工作。

环境信息

项目版本/值
SDK版本alibabacloud-dms20250414 1.0.4
Java版本OpenJDK 17.0.18
Spring Boot3.2.5
Regioncn-hangzhou / cn-beijing (均测试过,结果相同)
Endpointdms.{region}.aliyuncs.com

依赖配置

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>alibabacloud-dms20250414</artifactId>
    <version>1.0.4</version>
</dependency>

客户端初始化代码

StaticCredentialProvider provider = StaticCredentialProvider.create(
    Credential.builder()
        .accessKeyId(accessKeyId)
        .accessKeySecret(accessKeySecret)
        .build()
);

AsyncClient client = AsyncClient.builder()
    .region("cn-beijing")
    .credentialsProvider(provider)
    .overrideConfiguration(
        ClientOverrideConfiguration.create()
            .setEndpointOverride("dms.cn-beijing.aliyuncs.com")
    )
    .build();

详细调用日志

1. 创建会话 (成功)

请求参数:

{
  "DMSUnit": "cn-beijing",
  "title": "beijing-test"
}

阿里云返回:

{
  "agentId": "98xx70fkgs1qm0f85wju1lo38",
  "sessionId": "dvlizjdvin710i0ap4pn3m9hh",
  "agentStatus": "running"
}

2. 发送消息 (成功)

请求参数:

{
  "DMSUnit": "cn-beijing",
  "agentId": "98xx70fkgs1qm0f85wju1lo38",
  "sessionId": "dvlizjdvin710i0ap4pn3m9hh",
  "messageType": "primary",
  "message": "你好"
}

阿里云返回:

{
  "data": {
    "agentId": "98xx70fkgs1qm0f85wju1lo38",
    "message": "success",
    "sessionId": "dvlizjdvin710i0ap4pn3m9hh"
  },
  "errorCode": "Success",
  "errorMessage": "",
  "requestId": "04074F97-6B09-54D4-9F66-8D4EEAEE6FB6",
  "success": "true"
}

3. 获取聊天内容 (失败)

请求参数:

{
  "DMSUnit": "cn-beijing",
  "agentId": "98xx70fkgs1qm0f85wju1lo38",
  "sessionId": "dvlizjdvin710i0ap4pn3m9hh"
}

阿里云返回错误:

{
  "Code": "SignatureDoesNotMatch",
  "Message": "code: 400, Specified signature is not matched with our calculation. server string to sign is: POST&%2F&AccessKeyId%3DLTAI5t6f46Nnua18yxYgXbS1%26Action%3DGetChatContent%26AgentId%3D98xx70fkgs1qm0f85wju1lo38%26DMSUnit%3Dcn-hangzhou%26Format%3DJSON%26SessionId%3Dxxx%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3Dxxx%26SignatureVersion%3D1.0%26Timestamp%3Dxxx%26Version%3D2025-04-14",
  "RequestId": "FA294895-B059-5B8D-85A0-59968CCFD182"
}

完整错误堆栈

方式1: 使用 getChatContent 方法

com.aliyun.sdk.gateway.pop.exception.PopClientException: 
(Code: SignatureDoesNotMatch
Message: code: 400, Specified signature is not matched with our calculation. 
server string to sign is: 
POST&%2F&AccessKeyId%3DLTAI5t6f46Nnua18yxYgXbS1%26Action%3DGetChatContent%26AgentId%3D98xx70fkgs1qm0f85wju1lo38%26DMSUnit%3Dcn-hangzhou%26Format%3DJSON%26SessionId%3Denw8iy7s3j0o3suvynq35fw5q%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3Dc4d811aa-95af-459b-a7bf-b5b42d15e783177836373305631%26SignatureVersion%3D1.0%26Timestamp%3D2026-05-09T21%253A55%253A33Z%26Version%3D2025-04-14
Request ID: FA294895-B059-5B8D-85A0-59968CCFD182
Description: null)

    at com.aliyun.sdk.gateway.pop.interceptor.response.TeaResponseInterceptor.modifyResponse(TeaResponseInterceptor.java:82)
    at darabonba.core.interceptor.InterceptorChain.modifyResponse(InterceptorChain.java:87)
    at darabonba.core.TeaAsyncHandler$RetryableExecutor.lambda$attemptExecute$0(TeaAsyncHandler.java:297)
    at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:863)
    at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:841)
    at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:510)
    at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2147)
    ...

方式2: 使用 getChatContentWithResponseIterable 方法

java.lang.NullPointerException: Cannot invoke "String.toLowerCase()" because "key" is null

    at com.aliyun.sdk.gateway.pop.auth.SignatureComposer.buildCanonicalizedHeaders(SignatureComposer.java:40)
    at com.aliyun.sdk.gateway.pop.auth.SignatureComposer.composeStringToSign(SignatureComposer.java:29)
    at com.aliyun.sdk.gateway.pop.interceptor.httpRequest.HttpReqInterceptor.modifyHttpRequest(HttpReqInterceptor.java:105)
    at darabonba.core.interceptor.InterceptorChain.modifyHttpRequest(InterceptorChain.java:78)
    at darabonba.core.TeaAsyncHandler$RetryableExecutor.attemptExecute(TeaAsyncHandler.java:272)
    at darabonba.core.TeaAsyncHandler$RetryableExecutor.retryThenExecute(TeaAsyncHandler.java:229)
    at darabonba.core.TeaAsyncHandler$RetryableExecutor.execute(TeaAsyncHandler.java:190)
    at darabonba.core.TeaAsyncHandler.execute(TeaAsyncHandler.java:160)
    at com.aliyun.sdk.service.dms20250414.DefaultAsyncClient.getChatContentWithResponseIterable(DefaultAsyncClient.java:373)
    ...

相关 RequestID 列表

APIRequestID状态
CreateDataAgentSession-成功
SendChatMessageAAB0618A-013D-57D8-9755-6CC5FC22A809成功
SendChatMessage04074F97-6B09-54D4-9F66-8D4EEAEE6FB6成功
GetChatContentFA294895-B059-5B8D-85A0-59968CCFD182失败
GetChatContent927AA781-7A8B-57CF-976F-B5599BDB0EE5失败
GetChatContent381C16B1-9511-5EBD-9D47-FD0F01E7AC1B失败
GetChatContent614CD3FC-518E-57A3-B95B-75B2AE7AF0E8失败

问题分析

  1. 签名方法不一致: 从错误信息看,SDK 使用 SignatureMethod=HMAC-SHA1, SignatureVersion=1.0,但服务端校验失败

  2. 仅 GetChatContent 受影响: 其他 API(CreateDataAgentSession、SendChatMessage、DescribeDataAgentSession)使用相同凭证配置均正常,说明凭证本身没有问题

  3. SDK 内部空指针: getChatContentWithResponseIterable 方法在 SignatureComposer.buildCanonicalizedHeaders 处出现空指针,疑似 SDK 内部 bug,某个 HTTP header 的 key 为 null

  4. Region 无关: 测试了 cn-hangzhou 和 cn-beijing,问题一致

  5. 服务器计算的签名字符串:

POST&%2F&AccessKeyId%3DLTAI5t6f46Nnua18yxYgXbS1%26Action%3DGetChatContent%26AgentId%3D98xx70fkgs1qm0f85wju1lo38%26DMSUnit%3Dcn-hangzhou%26Format%3DJSON%26SessionId%3Dxxx%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3Dxxx%26SignatureVersion%3D1.0%26Timestamp%3Dxxx%26Version%3D2025-04-14

期望结果

  1. 确认 GetChatContent API 是否需要特殊的签名配置(如 V3 签名)
  2. 如果是 SDK bug,请提供修复版本或 workaround
  3. 提供该 API 的正确调用示例代码

参考文档

https://help.aliyun.com/zh/dms/data-agent-openapi-integration-guide

展开
收起
lamage 2026-05-10 08:06:34 26 分享 版权
0 条回答
写回答
取消 提交回答
问答地址:
关联地址: