【问题标题】:Confluence REST API: HTTP 200 w/ Empty ResponseConfluence REST API:带有空响应的 HTTP 200
【发布时间】:2017-02-15 16:59:56
【问题描述】:

我似乎无法通过 Rest API 在 Confluence Cloud v1000.957.0 上创建新页面。我已经尝试使用 cURL 和 Python 都无济于事:我得到的只是 HTTP 200 每次都有一个空的 JSON 响应。如果我将凭据更改为不正确,我会收到 HTTP 401

curl -u ******@******.com:****** -X POST -H 'Content-Type: application/json' -d'{"type":"page","title":"TESTING123", "ancestors":[{"id":123456}], "space":{"key":"AA"},"body":{"storage":{"value":"<p>This is a new page</p>","representation":"storage"}}}' https://********.atlassian.net/wiki/rest/api/content/

为了匿名,我更改了 cURL 调用的一些细节,但我知道凭据、祖先 ID、空间密钥和 API URL 是正确的。我还验证了此帐户在 Confluence 中具有在此空间中创建页面的正确权限,并且已启用 Confluence 的 API 访问权限。

我尝试过的 API 调用的变体:

  1. 在网址末尾添加?os_authType=basic

  2. 添加尽可能多的参数(全部为空值)例如:

    • status: current
    • operations: []
    • metadata: {}
  3. 更改 API 调用以在 Confluence 空间的顶层创建页面(省略 ancestors 字段)。

  4. 添加此标头:Accept: application/json

  5. view 选项添加到调用的body 部分,然后将其附加到URL 的末尾:&amp;expand=body.view。我发现将它添加到 Python 代码会得到相同的结果,但是将其添加到 cURL 调用会打印出类似 [1] 42999 的内容(后一部分会随着每次调用而变化);然后在一个新命令或简单地按下Return时,它会打印[1]+ Done,后跟一大块空格,然后是我刚刚进行的cURL调用。

我在 Atlassian 的 JIRA for JIRA 软件中发现了一个非常相似的错误,所以显然这种情况也发生在 JIRA 上,但是是间歇性的。 https://jira.atlassian.com/browse/JRA-41559

我对 HTTP 协议不是很熟悉,所以我可能忽略了一些东西,所以我真的只是想尝试更多的选择(当然,一个解决方案是理想的)。

【问题讨论】:

  • 您是否成功检索了现有内容列表或使用了其他 API 请求?尝试通过浏览器调用一些 API 请求(仅通过 url 获取,使用浏览器扩展的 POST,例如YARC)来区分身份验证和请求问题。
  • 我没有,但我确实设法通过在 cURL 调用中省略用户名的域来使其工作。

标签: curl response confluence confluence-rest-api


【解决方案1】:

问题是您使用带有域作为凭据的用户名 (******@******.com:******)

您可以通过询问主要 wiki 内容来检查这是否有效。
尝试: curl -u &lt;user&gt;:&lt;pass&gt; https://&lt;domain&gt;.atlassian.net/wiki/rest/api/content/

您也可以省略密码。 Curl 会要求它 - 从安全角度来看它更安全。
尝试: curl -u &lt;user&gt; https://&lt;domain&gt;.atlassian.net/wiki/rest/api/content/

【讨论】:

  • 这个问题其实有issue,但是Atlassian说已经解决了。
  • @lukegv:不同之处在于现在我们甚至没有得到401:unauthorized。相反,我们得到HTTP 200,响应为空(无JSON)和HTTP 标头字段X-Seraph-LoginReason: OK,这似乎表明登录正常
  • @maciej 如果我从用户名中删除域,这就是我得到的。我要发布的内容中没有b,所以除非这是一个奇怪的编码问题,否则我认为它不是来自我要发布的内容。 {"statusCode":500,"message":"org.codehaus.jackson.JsonParseException: Unexpected character ('b' (code 98)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')\n at [Source: com.atlassian.confluence.plugins.restapi.filters.LimitingRequestFilter$1@1097e3e; line: 1, column: 2]"}
  • @maciej 抱歉,这就是我在 Python 中这样做时得到的。不过,它适用于 cURL!我将修改我的 Python 实现,看看我是否可以让它工作。非常感谢!
  • 我得到 500 的原因是因为我忘记将 Python 字典编码为 JSON 数据:我将原始字典传递给它。更正如下:json.dumps(data)
【解决方案2】:

对于最终来到这里的任何其他人...我遇到了这个确切的问题,其中 r = requests.get(URL, auth=(USER, PASSWORD) 到作为 wiki 页面的 URL .../wiki/rest/api/content/123454 将有 200 r。 status_code 和 r.text 为空。

修复是使用 requests.session() 并进行两次调用。一个(我假设)建立会话,第二个获取内容。

s = requests.session()
s.auth = (USER, PASSWORD)
r = s.get(url_base) # url_base = '.../wiki/rest/api'
r = s.get(url) # url = '.../wiki/rest/api/content/123453'

那么 r.text 就会有内容。

【讨论】:

    【解决方案3】:

    这也让我发疯了。最终通过创建会话找到了我的解决方案。不确定如何使用 cURL 执行此操作。可能要使用 PHP 什么的。我用过 NodeJS

    这里发生的情况是,当您提出第一个请求时,XSRF 令牌就会被发送出去。您需要一个会话来存储这些。存储后,它们必须与所有后续请求一起发送出去。

    我的应用程序是用 NodeJS 编写的。其他语言的 YMMV,但以下对我有用:

    var request = require('request');
    
    /* GET home page. */
    router.get('/', function(req, res, next) {
      var cookieJar = request.jar(); // <-- THIS IS THE IMPORTANT PART
    
      var options = { method: 'GET',
      url: 'https://test.atlassian.net/wiki/rest/api/content',
      jar: cookieJar,
      headers:
       {'cache-control': 'no-cache',
         authorization: 'Basic yourBase64AuthToken' } };
    
      // You'll need to make two requests, one to get the tokens,
      // and another to actually get your query to work
      request(options, function (error, response, body) {
        if (error) throw new Error(error);
        request(options, function (error, response, body) {
          if (error) throw new Error(error);
          console.log(body);
        });
      });
    
    res.send('hello');
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2020-05-21
      • 2017-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      相关资源
      最近更新 更多