2017-02-15 86 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'); 
}); 
相關問題