自动化代码调用Rally API上传附件失败:权限错误求助
解决Rally API上传附件时“未授权创建AttachmentContent”的问题
看起来你遇到的问题很典型——手动操作正常、其他API调用(比如创建测试用例)也没问题,但唯独上传附件时触发权限错误,大概率是API请求的构造细节出了问题,而不是真的权限不足。我来帮你拆解可能的原因和解决方案:
1. 首先排查字段名的大小写错误
你代码里写的"ProjecT"是大小写错误的!Rally的API字段名是严格区分大小写的,正确的字段名应该是"Project"。这个小错误会导致系统无法识别你指定的项目上下文,进而触发权限校验失败(因为系统不知道该用哪个项目的权限规则)。
2. 遵循Rally附件创建的正确流程
Rally创建附件需要分两步走,很多人会忽略这个流程细节:
- 第一步:创建
AttachmentContent(存储文件的实际内容) - 第二步:创建
Attachment(关联AttachmentContent和目标工件,比如测试用例)
修正后的代码示例(Java)
import com.google.gson.JsonObject; import java.util.Base64; import java.nio.file.Files; import java.nio.file.Paths; // 1. 读取文件并转成Base64编码(这一步很重要!) byte[] fileBytes = Files.readAllBytes(Paths.get("path/to/your/file.pdf")); String base64Content = Base64.getEncoder().encodeToString(fileBytes); // 2. 创建AttachmentContent请求体 JsonObject attachmentContent = new JsonObject(); attachmentContent.addProperty("Project", projectRef); // 修正字段名大小写 attachmentContent.addProperty("Name", "your-attachment-filename.pdf"); // 必填:文件名 attachmentContent.addProperty("Content", base64Content); // 必填:Base64编码的文件内容 // 发送POST请求到 Rally API的 /attachmentcontent/create 端点,获取返回的AttachmentContent ref String attachmentContentRef = sendPostRequest("https://rally1.rallydev.com/slm/webservice/v2.0/attachmentcontent/create", attachmentContent); // 3. 创建Attachment请求体,关联到目标测试用例 JsonObject attachment = new JsonObject(); attachment.addProperty("Project", projectRef); attachment.addProperty("Artifact", testCaseRef); // 关联你要附加的测试用例ref attachment.addProperty("AttachmentContent", attachmentContentRef); // 关联刚才创建的AttachmentContent // 发送POST请求到 /attachment/create 端点完成上传 sendPostRequest("https://rally1.rallydev.com/slm/webservice/v2.0/attachment/create", attachment);
3. 额外的排查点
- 认证上下文:虽然你能创建测试用例,但还是要确认请求头里的认证信息(比如API Key的
Authorization: ApiKey <your-key>或者ZSESSIONID)是否和手动操作使用的账号一致。 - 工作区上下文:如果你的项目属于特定工作区,可以在请求头里添加
X-RallyWorkspace: <workspace-ref>来明确指定,避免系统自动选择错误的上下文。 - 文件编码:确保文件内容是标准的Base64编码,不要包含换行或额外字符,否则会导致
AttachmentContent创建失败,进而触发权限错误(系统有时候会把格式错误伪装成权限问题)。
为什么手动上传正常?
因为手动操作时,Rally的前端会自动帮你处理这两步流程,并且正确设置所有字段和编码,而自动化代码需要你手动实现这些细节。
内容的提问来源于stack exchange,提问作者Pallavi Datar
相关产品推荐
相关产品推荐

