繁体   English   中英

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

[英]In C#, what is the right way to post attachments to 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");

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

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基本身份验证:(授权HTTP标头)包含“基本用户名:密码”。 但请注意,用户名:密码必须为base64编码。 URL还必须包含'os_authType = basic'查询参数。

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

来自Confluence文档(RTFM)

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

Post之前添加这个

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

这是我喜欢的方式:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM