2017-02-15 85 views
1

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

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/ 

我已经改变了卷曲呼吁匿名着想的一些细节,但我知道的凭据,祖先ID,空格键和API URL是正确的。我还验证了此帐户在Confluence中具有正确的权限以在此空间中创建页面,并启用了Confluence的API访问权限。在API调用

的变化,我曾尝试:

  1. 添加?os_authType=basic到URL
  2. 添加尽可能多的参数可能的(所有空值),如结束:
    • status: current
    • operations: []
    • metadata: {}
  3. 更改API调用以在Confluence空间内的顶层创建一个页面(省略ancestors字段)。
  4. 添加此标头:Accept: application/json
  5. 添加view选项呼叫的body部分,并随后此附加到URL的末尾:&expand=body.view。我发现将它添加到Python代码中会得到相同的结果,但将它添加到cURL调用中会打印出类似[1] 42999(后一部分随每次调用而变化);然后根据新的命令或简单地按下Return后,它会打印[1]+ Done后跟一大块空格,然后是我刚制作的卷曲调用。

我在JIRA软件的Atlassian的JIRA中发现了一个非常类似的错误,所以显然这也发生在JIRA上,但是是间歇性的。我对HTTP协议并不熟悉,所以可能有一些我可以忽略,所以我真的想要更多的选择来尝试(尽管解决方案当然是理想的)。

+0

您是否成功检索现有内容的列表或使用其他API请求?尝试通过浏览器调用一些API请求(GET只是通过url,带有浏览器扩展的POST,例如[YARC](https://chrome.google.com/webstore/detail/yet-another-rest-client/ehafadccdcdedbhcbddihehiodgcddpl) )区分认证和请求问题。 –

+0

我没有,但我确实设法通过在cURL调用中省略用户名域来实现它。 –

回答

2

的问题是,你正在使用的用户名与域凭据(****** @ ****** COM :******)

您可以检查如果这只是通过要求维基主要内容而发挥作用。
尝试: curl -u <user>:<pass> https://<domain>.atlassian.net/wiki/rest/api/content/

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

+0

在这个问题上实际上有一个[问题](https://jira.atlassian.com/browse/CONF-41704?src=confmacro),但Atlassian说它已经解决了。 –

+0

@lukegv:区别在于现在我们甚至没有'401:未授权'。相反,我们得到'HTTP 200',它具有空的回复(没有JSON)和HTTP标头字段'X-Seraph-LoginReason:OK',这似乎表明_Login是OK_。 – Maciej

+0

@maciej 这是我得到的,如果我从用户名称中删除域。我试图发布的内容中没有“b”,因此除非它是一个奇怪的编码问题,否则我认为它不是来自我要发布的内容。 org.codehaus.jackson.JsonParseException:意外字符('b'(code 98)):预期有效值(数字,字符串,数组,对象,真) ','false' 或'null')\ n at [Source:com.atlas[email protected]1097e3e; line:1,column:2]“}' –

0

对于其他人谁在这里结束了......我有这个确切的问题,其中一个r = requests.get(URL, auth=(USER, PASSWORD)到这是一个维基网页... /维基/ REST/API /内容的URL/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会有内容。

0

这也让我疯狂。我的解决方案最终通过创建会话找到。不确定如何使用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'); 
}); 
相关问题