API 基本概念
Adobe Workfront API的目標是透過引入透過HTTP運作的REST-ful架構,簡化與Workfront的整合的建置。 本檔案假設您熟悉REST和JSON回應,並說明Workfront API所採取的方法。
熟悉Workfront結構描述有助於您瞭解可用來從Workfront中提取資料以進行整合的資料庫關係。
限制和准則
為了確保一致的Workfront隨選系統效能,Workfront API會限制並行API執行緒。 此護欄可防止濫用API呼叫所導致的系統問題。 沙箱環境已設定相同的同時API執行緒限制,讓客戶和合作夥伴能夠在將程式碼發佈到生產環境之前準確測試API呼叫。
在生產、預覽和測試磁碟環境中,一般使用者請求的URI長度上限為8892個位元組,因為它們是透過Workfront CDN (Akamai)路由傳送。 此限制僅適用於透過CDN路由的URI。
免責宣告
任何使用API的情況都應先在Workfront測試版環境中進行測試,然後才能在生產環境中執行。 如果有任何客戶將API用于某項流程,而Workfront合理地認為該流程會對隨選軟體造成負擔(也就是說,該流程會對其他客戶的軟體效能造成重大負面影響),Workfront將保留請求客戶停止該流程的權利。 如果客戶沒有遵守規定,且問題仍然存在,Workfront保留終止程式的權利。
WORKFRONT API URL
如需有關您將用來呼叫Workfront API的URL的資訊,請參閱Adobe Workfront API呼叫的網域格式。
REST基本概念
本節簡要介紹如何與下列REST原則的Workfront REST API互動:
物件URI
系統中的每個物件都會獲得一個獨一無二的URI,由物件型別和ID組成。 下列範例顯示描述三個唯一物件的URI:
/attask/api/v15.0/project/4c78821c0000d6fa8d5e52f07a1d54d0
/attask/api/v15.0/task/4c78821c0000d6fa8d5e52f07a1d54d1
/attask/api/v15.0/issue/4c78821c0000d6fa8d5e52f07a1d54d2
物件型別不區分大小寫,可以是縮寫的ObjCode (例如proj)或替代物件名稱(專案)。
如需物件、有效物件代碼和物件欄位的清單,請參閱 API總管。
Category
物件,自訂欄位是Parameter
物件。營運
透過傳送HTTP請求至物件的唯一URI來控制物件。 要執行的作業會由HTTP方法指定。
標準HTTP方法會對應至下列作業:
- GET — 依ID擷取物件、依查詢搜尋所有物件、執行報表或執行具名查詢
- POST — 插入新物件
- PUT — 編輯現有的物件
- DELETE — 刪除物件
為了解決使用者端缺陷或通訊協定長度限制,可以使用方法引數覆寫HTTP行為。 例如,可藉由張貼下列URI來實作GET作業:
GET/attask/api/v15.0/project?id=4c78...54d0&method=get
GET/attask/api/v15.0/project/4c78...54d0?method=get
回應
每個要求都會有JSON格式的回應。 如果要求成功,回應會具有資料屬性,如果有問題,則會具有錯誤屬性。 例如,請求
GET /attask/api/v15.0/proj/4c7c08b20000002de5ca1ebc19edf2d5
會傳回類似下列的JSON回應:
{
"data": [
{
"percentComplete": 0,
"status": "CUR",
"priority": 2,
"name": "Brand New Project",
"ID": "4c7c08b20000002de5ca1ebc19edf2d5"
}
]
已針對PUT、POST和DELETE請求新增特殊安全性。 只有在URI中包含 sessionID=abc123 時,才能執行導致寫入資料庫或從資料庫刪除的任何要求。 下列範例說明這會如何尋找DELETE請求:
GET/attask/api/v15.0/project?id=4c78...54d0&method=delete&sessionID=abc123
GET/attask/api/v15.0/project/4c78...54d0?method=delete&sessionID=abc123
驗證
API會驗證每個請求,以確保使用者端有權檢視或修改請求的物件。
透過傳入工作階段ID來執行驗證,該ID可使用以下方法之一指定:
請求標頭驗證
首選的驗證方法是傳遞包含工作階段權杖的名為SessionID的請求標頭。 這樣的優點在於可以安全地抵禦跨網站請求偽造(CSRF)攻擊,並且不會為了快取目的而干擾URI。
以下是請求標頭的範例:
GET /attask/api/v15.0/project/search
SessionID: abc1234
要求引數驗證
您可以傳遞名為sessionID的請求引數來進行身分驗證,如下列範例所示:
GET /attask/api/v15.0/project/4c78821c0000d6fa8d5e52f07a1d54d0?sessionID=abc1234
Cookie型驗證
此API使用的是Web UI用於系統的相同基於Cookie的驗證。 其中,如果使用者端使用網頁UI登入Workfront,則從相同瀏覽器內進行的任何AJAX呼叫都會使用相同的驗證。
登入
/login
端點或API金鑰。 請改用下列其中一種驗證方法:- 使用JWT進行伺服器驗證
- 使用OAuth2進行使用者驗證
使用有效的使用者名稱和密碼,您可以使用以下要求來取得工作階段ID:
POST /attask/api/v15.0/login?username=admin&password=user
這樣會設定Cookie以驗證未來的請求,並傳回JSON回應,其中包含新建立的sessionID、登入使用者的使用者ID以及其他工作階段屬性。
產生API金鑰
您可以以該使用者身分登入系統時產生API金鑰,如下列範例所示:
PUT /attask/api/v15.0/user?action=generateApiKey&username= username&password=password&method=put
擷取先前產生的API金鑰
您也可以執行getApiKey,擷取先前為特定使用者產生的API金鑰:
PUT /attask/api/v15.0/user?action=getApiKey&username=user@email.com&password=userspassword&method=put
然後,您可以使用此結果,新增「apiKey」作為請求引數,取代工作階段ID或使用者名稱和密碼,以驗證任何API呼叫。 從安全性角度來看,這是有好處的。
以下請求為使用apiKey從專案擷取資料的範例:
GET /attask/api/v15.0/project/abc123xxxxx?apiKey=123abcxxxxxxxxx
使API金鑰失效
如果apiKey值已洩漏,您可以執行「clearApiKey」,讓目前的API金鑰失效,如下列範例所示:
GET /attask/api/v15.0/user?action=clearApiKey&username=user@email.com&password=userspassword&method=put
清除後,您可以再次執行getApiKey以產生新的API金鑰。
登出
工作階段完成時,您可以使用以下請求將使用者登出,防止任何使用sessionID的進一步存取。
GET /attask/api/v15.0/logout?sessionID=abc1234
要登出的sessionID可指定為Cookie、請求標頭或請求引數。
登出使用者:
-
導覽至您的登入畫面,但不登入。
-
將URL變更為/attask/api/v15.0/project/search。
請注意,找不到該頁面。 -
以login?username=admin&password=user取代 搜尋 這個字,將您的使用者名稱和密碼取代為 admin 和*user
*此工作階段會以Cookie形式儲存在瀏覽器中,不需要在後續每個GET要求中重新陳述。 -
將URL變更回 /attask/api/v15.0/project/search。
-
請注意提供的回應。
執行PUT、POST和DELETE要求時,您必須一律包含登入後提供的sessionID。
GET行為
使用HTTPGET方法擷取一或多個物件,並執行報表。
正在擷取物件
您可以使用修飾詞和篩選器來增強物件的搜尋。
使用物件識別碼擷取物件
如果您知道物件的ID,可以存取物件的唯一URI來擷取該物件。 例如,請求
GET /attask/api/v15.0/project/4c78821c0000d6fa8d5e52f07a1d54d0
會傳回類似下列的回應:
{
"percentComplete": 0,
"status": "CUR",
"priority": 2,
"name": "Brand New Project",
"ID": "4c7c08b20000002de5ca1ebc19edf2d5"
}
您可以指定id請求引數,並提供ID清單(以逗號分隔),在相同請求中擷取多個物件,如下列範例所示:
GET /attask/api/v15.0/project?id=4c78...54d0,4c78...54d1
請注意/attask/api/v15.0/project?id=…要求與/attask/api/v15.0/project/...
要求相同。
使用URI擷取物件
如果您想要依據ID以外的條件擷取物件,則可搜尋URI。
例如,您可以使用以下請求來傳回系統中所有專案的清單:
GET /attask/api/v15.0/project/search
您可以使用要求引數做為名稱 — 值組來指定篩選器。 例如,下列範例顯示會尋找所有目前專案的要求:
GET /attask/api/v15.0/project/search?status=CUR
以下請求會尋找所有尚未完成的工作,以及指派給名為John的使用者的工作。
GET /attask/api/v15.0/task/search?percentComplete=100
&percentComplete_Mod=lt &assignedTo:firstName=John
使用搜尋修飾元
下表列出您可以搭配Workfront API使用的一些修飾元。
…status=cls&status_Mod=eq…
…status=cls&status_Mod=ne…
…percentComplete=50&percentComplete_Mod=gte…
…percentComplete=50&percentComplete_Mod=lte…
…description_Mod=isnull…
…description_Mod=notnull…
…name=Workfront&name_Mod=contains…
…entryDate=$$TODAY-7d&entryDate_Range=$$TODAY&entryDate_Mod=between…
使用OR陳述式
您可以新增包含「OR」的引數,以及數字來指示篩選或一系列篩選的層級,藉此增強搜尋。
OR陳述式只會傳回API呼叫中符合OR陳述式篩選條件的記錄。 OR陳述式層級不會隱含篩選器。
例如,如果您要篩選
- 名稱包含「Planning」或
- 名為「FixedAssets」的投資組合中的任務,以及指派給名稱包含「Steve」OR之人員的任務
- 具有名為「最終任務」之父系任務的任務
然後搭配使用下列API呼叫的多個OR陳述式:
GET/attask/api/v15.0/task/search?name=Planning
&name_Mod=contains
&OR:1:portfolio:name=FixedAssets
&OR:1:portfolio:name_Mod=eq
&OR:1:assignedTo:name=Steve
&OR:1:assignedTo:name_Mod=cicontains
&OR:2:parent:name=Final Task
&OR:2:Name_Mod =eq
使用篩選器引數
將URL引數用於搜尋篩選的一個潛在陷阱是Workfront會先剖析某些引數,再檢查是否有不同的驗證方法(即使用者名稱、密碼、apiKey、Cookie)。 發生此情況時,引數不會作為呼叫中的篩選器。
若要避免此問題,您可以將這些值放入具有JSON格式的篩選引數中。 例如,如果您想篩選使用者名稱testuser,而不是使用
/attask/api/v15.0/user/search?username=testuser@workfront.com
/attask/api/v15.0/user/search?filters={"username":"testuser@workfront.com"}
使用對應要求引數
依預設,從搜尋傳回的資料為JSON陣列。 根據您的使用案例,以JSON物件格式依ID編制索引可能更有效率。 使用對應要求引數即可完成這項操作。 例如,請求
/attask/api/v15.0/task/search?map=true
{
"data": {
「4c9a97db0000000f13ee4446b9aead9b」: {
"percentComplete": 0,
"status": "NEW",
"name": "first task",
"ID": "4c9a97db0000000f13ee4446b9aead9b",
"taskNumber": 1
},
"4ca28ba600002024cd49e75bd43cf601": {
"percentComplete": 0,
"status": "INP:A",
"name": "second task",
"ID": "4ca28ba600002024cd49e75bd43cf601",
"taskNumber": 2
}
}
使用欄位請求引數
依預設,擷取物件只會傳回最常用的欄位子集。
您可以使用欄位請求引數,指定傳回之特定欄位的逗號分隔清單。 例如,請求
/attask/api/v15.0/task/search?fields=plannedStartDate,priority
{
"priority": 2,
"name": "first task",
"ID": "4c7c08fa0000002ff924e298ee148df4",
"plannedStartDate": "2010-08-30T09:00:00:000-0600"
}
如需可能的欄位參考清單,請參閱 API總管
搜尋巢狀物件
您可以搜尋巢狀物件。 依預設,巢狀物件只傳回名稱和ID。 例如,若要與擁有者取得所有問題,請使用以下請求:
/attask/api/v15.0/issue/search?fields=owner
/attask/api/v15.0/issue/search?fields=owner:title,owner:phoneNumber
{
"name": "an important issue",
"ID": "4c78285f00000908ea8cfd66e084939f",
"owner": {
"title": "Operations Specialist",
"phoneNumber": "555-1234",
"name": "Admin User",
"ID": "4c76ed7a0000054c172b2c2d9f7f81c3"
}
正在擷取巢狀集合
您可以擷取巢狀物件集合。 例如,若要取得包含其所有任務的專案,請使用以下請求:
/attask/api/v15.0/project/search?fields=tasks
/attask/api/v15.0/task/search?fields=assignments
搜尋多個巢狀欄位
依預設,僅會傳回每個工作的名稱和ID,但可以使用冒號語法指定其他巢狀欄位。 若要檢視相關物件或集合的所有可用欄位,只需在物件/集合參考中附加冒號和星號即可。
/attask/api/v15.0/task/search?fields=assignments:*
擷取自訂資料
您可以使用前置詞「DE:」來擷取自訂資料欄位。 例如,若要使用名為「CustomText」的引數請求專案,請使用以下請求:
/attask/api/v15.0/project/search?fields=DE:CustomText
{
"name": "custom data project",
"ID": "4c9a954f0000001afad0687d7b1b4e43",
"DE:CustomText": "任務b"
}
/attask/api/v15.0/project/search?fields=parameterValues
{
"name": "custom data project",
"ID": "4c9a954f0000001afad0687d7b1b4e43",
引數值: {
"DE:CustomText": "任務b",
"DE:CustomNumber": 1.4,
"DE:CustomCheckBoxes": ["first", "second", "third"]
}
使用具名查詢
某些物件型別已命名搜尋,通常會執行,而且可將查詢名稱附加至物件型別URI的結尾來使用。 例如,以下請求會擷取使用者目前被指派的工作專案(任務和問題):
/attask/api/v15.0/work/myWork
使用Count
您可以使用count
傳回符合查詢的結果數目。 當您不需要結果中的資料時,這會很有用。 只傳回計數,伺服器就能更快速地處理請求,並節省頻寬。 例如,請求
GET/attask/api/v15.0/project/count?status=CUR
{
"count": 3
}
請求報告
您可以執行報表請求,其中一個或多個分組只需要某些欄位的彙總。 如下列範例所示,報表語法與SOAP API的語法相同:
GET/attask/api/v15.0/hour/report?project:name_1_GroupBy=true&hours_AggFunc=sum
{
「第一個專案」: {
"sum_hours": 15
},
「第二個專案」: {
"sum_hours": 30
}
{
「第一個專案」: {
"sum_hours": 15
},
「第二個專案」: {
"sum_hours": 30
},
"$$ROLLUP": {
"sum_hours": 45
}
}
排序API中的查詢結果
如果您將以下內容附加至API呼叫,則可以根據任何欄位來排序結果:
&entryDate_Sort=asc
例如,如果您要依任務計劃開始日期排序,請移除entryDate並將其取代為plannedCompletionDate。
這適用於Workfront中的大部分欄位。
考慮查詢限制
查詢物件時,應特別注意相關物件的關係和搜尋限制。 例如,如下表所示,專案查詢最多可傳回2,000個專案。 這2,000個專案會視為「主要物件」。 如果您在專案上查詢「任務」欄位,則作為集合的「任務」欄位會成為主要物件「專案」的次要物件。 「任務」欄位的查詢可包含專案中的數千個任務。 傳回的物件(專案和任務)組合總數不能超過50,000個的上限。
為確保最佳效能,下表顯示對搜尋要求的限制。
使用分頁回應 using-paginated-responses
若要覆寫「預設結果數目」查詢限制並允許200個結果,您可以在查詢中包含$$LIMIT=200
篩選器,如下列範例所示:
GET/attask/api/v15.0/project/search?$$LIMIT=200
為確保系統中其他租使用者的可靠性和效能,每個查詢允許的結果限制上限為2000個物件。 嘗試指定較大的限制會導致IllegalArgumentException
錯誤訊息。
因此,我們建議您針對大型資料集使用分頁回應。 若要指定應傳回的第一個結果,請新增$$FIRST
篩選器。 例如,下列要求會針對查詢傳回結果201-250:
GET/attask/api/v15.0/project/search?$$FIRST=200&$$LIMIT=50
請注意,在上述範例中,$$FIRST=200
會傳回第201個結果。 $$FIRST=0
會傳回第一個結果。 將$$FIRST值視為在傳回結果之前要略過的結果數可能會有所幫助。
為確保結果正確分頁,請使用排序引數。 如此可讓結果以相同順序傳回,因此分頁不會重複或略過結果。 例如,若要使用物件識別碼排序,請使用ID_Sort=asc
。
建立存取規則
您可以建立存取規則,以決定誰可以存取物件。 以下是您可以設定的存取規則範例:
若要設定專案,使其僅與ID為「abc123」的使用者共用,請使用以下請求:
GET/attask/api/v15.0/project/123abcxxxxxxxxxxxxxxxxxxxxxx?method=put &updates={ accessRules: [ {accessorID: 'abc123', accessorObjCode: 'USER', coreAction: 'VIEW'} ] }
GET/attask/api/v15.0/project/123abcxxxxxxxxxxxxxxxxxxxxxx/share?method=put&accessorID=abc123&accessorObjCode=USER&coreAction=VIEW
GET/attask/api/v15.0/project/123abcxxxxxxxxxxxxxxxxxxxxxxxx?fields=accessRules:*
POST行為
POST插入新物件。 語法與PUT相同,但有一些例外。 因為新物件尚未存在,所以它沒有ID。 因此,URI不包含ID。
建立物件
以下是建立新專案的請求範例:
POST/attask/api/v15.0/project?name=New Project
複製物件
有些物件支援複製。 對於這些物件型別,可以使用copySourceID引數張貼來建立新物件。 例如,以下請求會複製指定的專案,並賦予專案新名稱:
POST /attask/api/v15.0/project?copySourceID=4c7...&name=Copied Project
正在上傳檔案
您可以透過下列API URL上傳檔案:
POST/attask/api/v15.0/upload
{
"handle": "4c7c08fa0000002ff924e298ee148df4"
}
POST/attask/api/v15.0/document?updates={
} 名稱: aFileName,
控制代碼: abc...123, (來自檔案上傳的控制代碼)
docObjCode: PROJ, (或TASK、OPTASK等)
物件ID: abc...123,
currentVersion:{version:v1.0,檔案名稱:aFileName}
}
PUT行為
PUT可用來更新現有的物件。
PUT的回應與GET相同。 在這兩種情況下,伺服器都會在更新後傳回物件的新狀態。 所有用於變更對GET請求的回應的規則也可與PUT搭配使用,例如指定要傳回的其他欄位、自訂資料等。
編輯物件
物件的更新一律會使用物件的唯一URI依ID完成。 要更新的欄位會指定為請求引數。 例如,若要變更專案名稱,您可以傳送類似下列的請求:
PUT/attask/api/v15.0/project/4c7...?name=新專案名稱
PUT/attask/api/v15.0/project?id=4c7...&name=新專案名稱
指定JSON編輯
如以下範例所示,您可以使用更新請求引數,指定使用JSON語法要更新的欄位:
PUT/attask/api/v15.0/project/4c7...?更新=
{
名稱:「新專案名稱」,
狀態: "CUR",
...
}
進行巢狀更新
有些物件擁有可以更新的私人擁有集合。 例如,下列範例示範如何覆寫指定任務的現有指派:
PUT/attask/api/v15.0/task/4c7...?更新=
{
指派: [
{
assignedToID: "2222...54d0,
assignmentPercent: 50.0
},{
roleID: "1111...54d0"
}
]
下列範例會將專案設為公開服務檯佇列。 請注意,現有的佇列屬性會被取代。
PUT/attask/api/v15.0/project/4c7...?更新=
{
queueDef: {
isPublic: 1
}
}
使用動作要求引數
某些物件支援除了簡單編輯外可以執行的其他動作。 您可以使用動作要求引數指定這些動作。 例如,下列請求會重新計算指定專案的時間表:
PUT/attask/api/v15.0/project/4c7...?action=calculateTimeline
或
PUT/attask/api/v15.0/project/4c7.../calculateTimeline
移動物件
以下示範將任務從一個專案移動到另一個專案的語法:
PUT/attask/api/v15.0/task/4c7.../move?projectID=5d8...
PUT/attask/api/v15.0/project/1234/approveApproval
PUT/attask/api/v15.0/project/1234/calculateFinance
PUT/attask/api/v15.0/project/1234/calculateTimeline
PUT/attask/api/v15.0/project/1234/calculateDataExtension
PUT/attask 4/recallApproval
PUT/attask/api/v15.0/project/1234/rejectApproval
PUT/attask/api/v15.0/task/1234/move
PUT/attask/api/v15.0/workitem/1234/markViewed
以下是每種動作型別的範例:
PUT/attask/api/v15.0/project/1234?method=put&updates={accessRules:[{accessorID: 'abc123', accessorObjCode: 'USER', coreAction: 'VIEW'}]}
共用物件
下列範例示範與團隊共用專案的語法:
PUT/attask/api/v15.0/project/123abcxxxxxxxxxxxxxxxxxxxxxxxx/share?accessorID=123abcxxxxxxxxxxxxxxxxxxxxxx&accessorObjCode=TEAMOB
PUT/attask/api/v15.0/project/123abcxxxxxxxxxxxxxxxxxxxxxxxx?method=PUT&updates={accessRules:[{accessorID:'123abcxxxxxxxxxxxxxxxxxxxxxxxxxx',accessorObjCode:'TEAMOB',coreAction:'VIEW'}]
PUT/attask/api/v15.0/task/4c7.../move?projectID=5d8...
DELETE行為
DELETE會移除物件。 在任何情況下,URI都可以包含引數force=true ,以讓伺服器移除指定的資料及其相依專案。 在以下範例中,會藉由在URI上執行HTTPDELETE方法來刪除工作:
DELETE/attask/api/v15.0/task/4c78821c000d6fa8d5e52f07a1d54d0
DELETE/attask/api/v15.0/task?id=4c78821c0000d6fa8d5e52f07a1d54d0
DELETE/attask/api/v15.0/task/4c78821c00000d6fa 5e52f07a1d54d0?force=true
DELETE/attask/api/v15.0/task?id=4c78821c0000d6fa8d5e52f07a1d54d0?force=true
大量更新
大量更新陳述式會在單一API呼叫中同時更新多個物件。 大量建立API呼叫的建置方式與一般更新呼叫類似,如下列範例所示:
PUT/attask/api/v15.0/proj?updates=[{"name":"Test_Project_1"},{"name":"Test_Project_2"}]&method=POST&apiKey=123ab-cxxxxxxxxxxxxxxxxxxxxxxxxxxxx
資料: [{
} ID: "53ff8d3d003b438b57a8a784df38f6b3",
名稱: "Test_Project_1",
物件代碼: "PROJ",
percentComplete: 0,
plannedCompletionDate: "2014-08-28T11:00:00:000-0400",
plannedStartDate: "2014-08-28T11:00:00:000-0400",
優先順序: 0,
projectedCompletionDate: "2014-08-28T16:12:00:000-0400",
狀態: "CUR"
},
{
ID: "53ff8d49003b43a2562aa34eea3b6b10",
名稱: "Test_Project_2",
物件代碼: "PROJ",
percentComplete: 0usi,
plannedCompletionDate: "2014-08-28T11:00:00:000-0400",
plannedStartDate: "2014-08-28T11:00:00:000-0400",
優先順序: 0,
projectedCompletionDate: "2014-08-28T16:12:00:000-0400",
狀態: "CUR"
}]
PUT/attask/api/v15.0/proj?Umethod=PUT&updates=[{"ID":"123abcxxxxxxxxxxxxxxxxxxxxxxxxxx","name":"Test_Project_1_ Edit"},{"ID":"123abcxxxxxxxxxxxxxxxxxxxxxxxxxx","name":"Test_Project_2_Edit"}]&apiKey=123abcxxxxxxxxxxxxxxxxxxxxxxxxxxxx
資料: [ {
} 識別碼: 「53ff8e15003b461d4560f7f65a440078」,
名稱: "Test_Project_1_Edit",
物件代碼: "PROJ",
percentComplete: 0,
plannedCompletionDate: "2014-08-28T11:00:00:000-0400",
plannedStartDate: "2014-08-28T11:00:00:000-0400",
優先順序: 0,
projectedCompletionDate: "2014-08-28T16:16:00:000-0400",
狀態: "CUR"
},
{
ID: "53ff8e19003b46238a58d303608de502",
名稱: "Test_Project_2_Edit",
物件代碼: "PROJ",
percentComplete: 0,
plannedCompletionDate: "2014-08-28T11:00:00:000-0400",
plannedStartDate: "2014-08-28T11:00:00:000-0400",
優先順序: 0,
projectedCompletionDate: "2014-08-28T16:16:00:000-0400",
狀態: "CUR"
}]