在 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 的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章