【问题标题】:In C#, what is the right way to post attachments to Confluence REST API?在 C# 中,将附件发布到 Confluence REST API 的正确方法是什么?
【发布时间】:2015-09-25 11:12:07
【问题描述】:

我正在从 Confluence 的 SOAP API 迁移到使用 their REST API。我看到有支持 for adding attachments to a page (by doing a POST) 但我遇到了让它工作的问题(我收到 403: Forbidden 错误消息)。我有其他“获取”项目通过其余 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");

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

【问题讨论】:

  • Confluence 文档保持:“如果附件被禁用或您无权向此内容添加附件,则返回。”。您是否尝试过在此处docs.atlassian.com/confluence/REST/latest/#d3e787 的页面中使用 CURL 并查看它是否仍返回 403?
  • 我刚刚尝试了 curl,但出现错误 curl Recv failure: Connection was reset。我使用了这个语法 curl -D- -u user:pwd -X POST -H "X-Atlassian-Token: nocheck" -F "file=@test.txt" htttp://example:9088/rest/api/content /71105117/child/attachment(注意:我在此评论中的“http”中添加了一个额外的“t”,因此不会尝试将其转换为超链接
  • @SimonMourier - 另外,上面的 C# 代码是否需要其他身份验证?
  • 哦,是的,可能您需要在请求中添加一些凭据。
  • 你检查过 Confluence 的设置吗? Confluence 允许使用附件吗?系统-> 选择高级-> 附件

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


【解决方案1】:

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,您还应该为每个请求指定以下url参数:os_authType=basic

HTTP基本认证:(Authorization HTTP header)包含 '基本用户名:密码'。但是请注意,用户名:密码必须 进行 base64 编码。该 URL 还必须包含 'os_authType=basic' 查询参数。

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

【讨论】:

    【解决方案2】:

    来自 Confluence 文档 (RTFM)

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

    Post之前添加这个

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

    【讨论】:

    • 我添加了新行并更新了问题。现在的问题是尝试添加这个,现在我得到 403: Forbidden
    • SO 规定每个帖子只提出 1 个问题。更改为新问题应该是另一个帖子。这样做的原因是其他人能够搜索特定问题的答案。
    【解决方案3】:

    这是我喜欢的方式:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-12
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-30
      • 1970-01-01
      • 1970-01-01
      • 2018-10-12
      相关资源
      最近更新 更多