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

leo*_*ora 7 c# rest httpclient confluence confluence-rest-api

我正在从Confluence的SOAP API迁移到使用他们的REST API.我看到有支持向页面添加附件(通过执行POST),但我遇到了让它工作的问题(我收到403:Forbidden Error消息).我有其他"获取"项目通过其余的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");
Run Code Online (Sandbox Code Playgroud)

你能看出我上面做错了吗?

Vov*_*ova 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);
Run Code Online (Sandbox Code Playgroud)

根据此链接,您还应该为每个请求指定以下url参数:os_authType=basic.

HTTP基本身份验证:(授权HTTP标头)包含"基本用户名:密码".但请注意,用户名:密码必须为base64编码.URL还必须包含'os_authType = basic' 查询参数.

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


Ric*_*der 3

来自 Confluence 文档 (RTFM)

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

在之前添加此内容Post

httpClient.Headers.Add("X-Atlassian-Token", "nocheck");
Run Code Online (Sandbox Code Playgroud)

  • SO 规定每个帖子仅提出 1 个问题。更改为新问题应该是另一篇文章。这样做的原因是其他人能够搜索特定问题的答案。 (6认同)