[英]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.