7

我正在从 Confluence 的 SOAP API 迁移到使用他们的 REST API。我看到支持向页面添加附件(通过执行 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");

你能看看我上面做错了什么吗?

4

3 回答 3

5

403 状态表示请求未被授权。为了授权请求,您需要指定Authorization标头。Confluence REST API 支持基本授权方案。对于基本身份验证,您需要为每个请求指定以下标头:Authorization: Basic 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 连接;

于 2015-10-02T04:04:23.663 回答
3

来自 Confluence 文档 (RTFM)

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

Post

httpClient.Headers.Add("X-Atlassian-Token", "nocheck");
于 2015-09-25T11:24:05.133 回答
1

这是我喜欢的方式:

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);
}
于 2017-10-10T13:00:03.020 回答