在 C# 中,将附件发布到 Confluence REST API 的正确方法是啥?

Posted

技术标签:

【中文标题】在 C# 中,将附件发布到 Confluence REST API 的正确方法是啥?【英文标题】:In C#, what is the right way to post attachments to Confluence REST API?在 C# 中,将附件发布到 Confluence REST API 的正确方法是什么? 【发布时间】:2015-09-25 11:12:07 【问题描述】:

我正在从 Confluence 的 SOAP API 迁移到使用 their REST API。我看到有支持 for adding attachments to a page (by doing a POST) 但我遇到了让它工作的问题(我收到 403: Forbidden 错误消息)。我有其他“获取”项目通过其余 api 工作正常,但做附件帖子似乎一直失败。

这是我当前的代码(给定一个特定的文件名):

 byte[] rawData = File.ReadAllBytes(filename);
 var pageId = "11134";
 var url = new Uri("http://example.com:9088/rest/api/content/" + pageId + "/child/attachment");
 var requestContent = new MultipartFormDataContent();
 var imageContent = new ByteArrayContent(rawData);
 imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse(attachement.contentType);
 requestContent.Add(imageContent, "file", attachement.fileName);
 requestContent.Headers.Add("X-Atlassian-Token", "nocheck");

你能看看我上面做错了什么吗?

【问题讨论】:

Confluence 文档保持:“如果附件被禁用或您无权向此内容添加附件,则返回。”。您是否尝试过在此处docs.atlassian.com/confluence/REST/latest/#d3e787 的页面中使用 CURL 并查看它是否仍返回 403? 我刚刚尝试了 curl,但出现错误 curl Recv failure: Connection was reset。我使用了这个语法 curl -D- -u user:pwd -X POST -H "X-Atlassian-Token: nocheck" -F "file=@test.txt" htttp://example:9088/rest/api/content /71105117/child/attachment(注意:我在此评论中的“http”中添加了一个额外的“t”,因此不会尝试将其转换为超链接 @SimonMourier - 另外,上面的 C# 代码是否需要其他身份验证? 哦,是的,可能您需要在请求中添加一些凭据。 你检查过 Confluence 的设置吗? Confluence 允许使用附件吗?系统-> 选择高级-> 附件 【参考方案1】:

403 状态表示请求未被授权。为了授权请求,您需要指定 Authorization 标头。 Confluence REST API 支持基本授权方案。对于基本身份验证,您需要为每个请求指定以下标头:Authorization: Basic username:password 其中 username:password 部分应为 Base64 编码。您可以使用以下代码来执行此操作:

string userName;
string password;
string authorizationString = userName + ":" + password;
string encodedValue = Convert.ToBase64String(Encoding.ASCII.GetBytes(authorizationString));
string authorizationHeaderValue = "Basic " + encodedValue;

requestContent.Headers.Add("Authorization", authorizationHeaderValue);

根据这个link,您还应该为每个请求指定以下url参数:os_authType=basic

HTTP基本认证:(Authorization HTTP header)包含 '基本用户名:密码'。但是请注意,用户名:密码必须 进行 base64 编码。该 URL 还必须包含 'os_authType=basic' 查询参数。

注意:如果使用基本身份验证,请确保通过 https 连接;

【讨论】:

【参考方案2】:

来自 Confluence 文档 (RTFM)

为了防止 XSRF 攻击,因为这个方法接受 multipart/form-data,所以它上面有 XSRF 保护。这意味着你必须在请求中提交一个 X-Atlassian-Token: nocheck 的 header,否则会被阻塞。

Post之前添加这个

httpClient.Headers.Add("X-Atlassian-Token", "nocheck");

【讨论】:

我添加了新行并更新了问题。现在的问题是尝试添加这个,现在我得到 403: Forbidden SO 规定每个帖子只提出 1 个问题。更改为新问题应该是另一个帖子。这样做的原因是其他人能够搜索特定问题的答案。【参考方案3】:

这是我喜欢的方式:

string url = "https://localhost:8080/confluence/rest/api/content/123456/child/attachment";
string filename = @"C:\temp\test.txt";
using (var client = new WebClient())

    string authorizationString = username + ":" + password;
    string encodedValue = Convert.ToBase64String(Encoding.ASCII.GetBytes(authorizationString));
    client.Headers.Add("Authorization", "Basic " + encodedValue);
    client.Headers.Add("X-Atlassian-Token", "nocheck");
    byte[] result = client.UploadFile(url, filename);
    string responseAsString = Encoding.Default.GetString(result);

【讨论】:

以上是关于在 C# 中,将附件发布到 Confluence REST API 的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Confluence 6 附件存储选项

Confluence 6 附件存储选项

Confluence 6 从一个备份中获得文件附件

Confluence 6 附件是如何被索引的

Confluence 6 数据库表-内容(Content)

Confluence 6 数据库表-内容(Content)