在C#中,如何正确地将附件发布到Confluence REST API?

7
我正在从Confluence的SOAP API迁移到使用他们的REST API。 我看到有支持通过进行POST添加附件到页面,但是我遇到了问题,无法使其工作(我收到了一个403:禁止错误消息)。 我通过rest api获得其他“get”项正常工作,但似乎附件发布一直失败。
这是我的当前代码(给定特定的文件名):
 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文档中写道:“如果附件被禁用或您没有权限向此内容添加附件,则返回”。您是否尝试使用CURL,就像这个页面https://docs.atlassian.com/confluence/REST/latest/#d3e787中所述,并查看它是否仍然返回403? - Simon Mourier
我刚刚尝试了curl,但是出现了错误curl <56> 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”,以免SO尝试将其转换为超链接)。 - leora
@SimonMourier - 另外,上述C#代码是否需要其他身份验证? - leora
哦,是的,你可能需要为请求添加一些凭据。 - Simon Mourier
他们的文档中写道,如果附件被禁用或者您没有权限向此内容添加附件,则会收到403错误。- 你看到了吗? - Buzinas
显示剩余3条评论
3个回答

5

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);

根据链接,您还需要在每个请求中指定以下url参数:os_authType=basic

HTTP基本身份验证:(包含Authorization HTTP标头)包含“Basic username:password”。但是请注意,username:password必须进行Base64编码。 URL还必须包含'os_authType=basic'查询参数。

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


3

来自Confluence文档(RTFM)

为了防止XSRF攻击,因为此方法接受multipart/form-data,所以它具有XSRF保护。这意味着您必须在请求中提交X-Atlassian-Token: nocheck头,否则将被阻止。

Post之前添加此内容。

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

我已经添加了新的一行并更新了问题。现在的问题是,我尝试添加这个,但现在我得到了403:禁止访问的错误。 - leora
6
SO规定每篇文章只能包含一个问题。如果要更改问题,应该创建另一篇文章。这样做的原因是为了让其他人能够搜索特定问题的答案。 - Richard Schneider

1
这是我喜欢的方式:

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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接