REST是一種簡潔方便的Web服務,通過基於http協議的遠程通信,可以為多種客戶端程序提供遠程服務,大幅提高了服務器系統的可擴展性。
微軟宣布從Team Foundation Server 從2015版本開始提供REST API遠程訪問,其實早在2014年Team Foudation Service(VSO)就發布了REST API的接口程序。TFS通過TEST,為多種客戶端和應用程序,多種設備提供了一種輕量級方式,使其可以快速與TFS服務器實現數據互訪。開發人員可以在Windows, Andriod, iOS等設備上運行的客戶端程序訪問TFS,實現代碼簽入,項目規划和跟蹤等幾乎所有TFS客戶端可以完成的工作。
在REST API推出之前,開發人員只能通過.NET API或者Java API實現TFS的擴展。現在通過REST API,客戶可以在任意平台和終端中實現擴展,特別是在手機移動端等設備。不同的開發人員可以使用自己熟悉的開發工具和開發語言,調用REST API,實現不同系統與TFS的集成。
這里我以最常見的JavaScript為例子,結合Jquery,通過最常見的工作項操作示例,來說明如何使用TFS的REST API接口。
在開始之前,你可以通過這個鏈接https://www.visualstudio.com/en-us/integrate/api/overview 獲取TFS所有API的描述。
1. 創建一個工作項
需要注意下面的示例程序中使用了Jquery讀取HTML控件中配置的信息,例如TFS的地址、團隊項目名稱、賬戶和密碼等。
function NewWit() {
var tfsurl = $("#TFSCollection").val() + $("#ProjectName").val() + "/_apis/wit/workitems/$" + $("#WorkItemType").val() + "?api-version=1.0";
//url的完整示例:https://{account}.visualstudio.com/defaultcollection/{project}/_apis/wit/workitems/${workitemtypename}?api-version={version}
$(TFSUrl).val(tfsurl);
var paraData = $("#ApiParas").val();//示例:[{"op":"add","path":"/fields/System.Title","value":"工作項標題"},{"op":"add","path":"/fields/System.AssignedTo","value":"tfsadmin"}]
$(ApiParas).val(paraData);
$.ajax({
url: tfsurl,
type: "PATCH",
contentType: "application/json-patch+json",
data: paraData,
success: function (data) {
$("#ApiResult").val(JSON.stringify(data));
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$("#ApiResult").val("ERROR:\n" + errorThrown);
},
username: $("#TFSUserName").val(),
password: $("#TFSPassword").val()
});
}
2. 修改工作項
function UpdateWit() {
var tfsurl = $("#TFSCollection").val() + "_apis/wit/workitems/" + $("#WitId").val() + "?api-version=1.0";
$(TFSUrl).val(tfsurl);
var paraData = $("#ApiParas").val(); //示例:[{"op":"add","path":"/fields/System.Title","value":"工作項標題"},{"op":"add","path":"/fields/System.AssignedTo","value":"tfsadmin"}]
$(ApiParas).val(paraData);
$.ajax({
url: tfsurl,
type: "PATCH",
contentType: "application/json-patch+json",
data: paraData,
success: function (data) {
$("#ApiResult").val(JSON.stringify(data));
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$("#ApiResult").val("ERROR:\n" + errorThrown);
},
username: $("#TFSUserName").val(),
password: $("#TFSPassword").val()
});
}
3. 添加工作項鏈接
function UpdateWit() {
var tfsurl = $("#TFSCollection").val() + "_apis/wit/workitems/" + $("#WitId").val() + "?api-version=1.0";
$(TFSUrl).val(tfsurl);
var paraData = $("#ApiParas").val(); //示例:[{"op":"add","path":"/relations/-","value":{"rel":"System.LinkTypes.Dependency-forward","url":"http://tfs2015cn:8080/tfs/AbchinaCollection/_apis/wit/workitems/17"}}]
$(ApiParas).val(paraData);
$.ajax({
url: tfsurl,
type: "PATCH",
contentType: "application/json-patch+json",
data: paraData,
success: function (data) {
$("#ApiResult").val(JSON.stringify(data));
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$("#ApiResult").val("ERROR:\n" + errorThrown);
},
beforeSend: function (xhr) {
$("#ApiResult").val("loading...");
},
username: $("#TFSUserName").val(),
password: $("#TFSPassword").val()
});
}
4. 修改迭代路徑
function UpdateWit() {
var tfsurl = $("#TFSCollection").val() + "_apis/wit/workitems/" + $("#WitId").val() + "?api-version=1.0";
$(TFSUrl).val(tfsurl);
var paraData = $("#ApiParas").val(); //示例:[{"op":"add","path":"/fields/System.Title","value":"工作項標題 user 2"},{"op":"add","path":"/fields/System.IterationPath","value":"CMMI\\迭代 0"}]
$(ApiParas).val(paraData);
$.ajax({
url: tfsurl,
type: "PATCH",
contentType: "application/json-patch+json",
data: paraData,
success: function (data) {
$("#ApiResult").val(JSON.stringify(data));
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
$("#ApiResult").val("ERROR:\n" + errorThrown);
},
username: $("#TFSUserName").val(),
password: $("#TFSPassword").val()
});
}
http://www.cnblogs.com/danzhang/ ALM MVP 張洪君
補充資源:
http://www.dotnetcurry.com/visualstudio/1162/using-rest-api-tfs-visual-studio-online
