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

时间:2015-09-25 11:12:07

标签: c# rest httpclient confluence confluence-rest-api

我正在从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");

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

3 个答案:

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