我正在从Confluence的SOAP API迁移到使用their REST API。我看到有支持for adding attachments to a page (by doing a POST),但我遇到问题让它工作(我收到 403:禁止错误消息)。我有其他的"得到"通过其余的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");
你能看出我上面做错了吗?
答案 0 :(得分: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);
根据此link,您还应为每个请求指定以下网址参数:os_authType=basic
。
HTTP基本身份验证:(授权HTTP头)包含 '基本用户名:密码'。但请注意,用户名:密码必须 是base64编码。该网址还必须包含' os_authType = basic' 查询参数。
注意:如果使用基本身份验证,请务必通过https进行连接;
答案 1 :(得分:3)
来自Confluence文档(RTFM)
为了防止XSRF攻击,因为此方法接受multipart / form-data,所以它具有XSRF保护。这意味着您必须提交X-Atlassian-Token标头:nocheck请求,否则将被阻止。
在Post
httpClient.Headers.Add("X-Atlassian-Token", "nocheck");
答案 2 :(得分:0)
这是我喜欢的方式:
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);
}