REST是一種簡潔方便的Web服務,經過基於http協議的遠程通訊,能夠爲多種客戶端程序提供遠程服務,大幅提升了服務器系統的可擴展性。ajax
微軟宣佈從Team Foundation Server 從2015版本開始提供REST API遠程訪問,其實早在2014年Team Foudation Service(VSO)就發佈了REST API的接口程序。TFS經過TEST,爲多種客戶端和應用程序,多種設備提供了一種輕量級方式,使其能夠快速與TFS服務器實現數據互訪。開發人員能夠在Windows, Andriod, iOS等設備上運行的客戶端程序訪問TFS,實現代碼簽入,項目規劃和跟蹤等幾乎全部TFS客戶端能夠完成的工做。json
在REST API推出以前,開發人員只能經過.NET API或者Java API實現TFS的擴展。如今經過REST API,客戶能夠在任意平臺和終端中實現擴展,特別是在手機移動端等設備。不一樣的開發人員可使用本身熟悉的開發工具和開發語言,調用REST API,實現不一樣系統與TFS的集成。api
這裏我以最多見的JavaScript爲例子,結合Jquery,經過最多見的工做項操做示例,來講明如何使用TFS的REST API接口。服務器
在開始以前,你能夠經過這個連接https://www.visualstudio.com/en-us/integrate/api/overview 獲取TFS全部API的描述。app
1. 建立一個工做項工具
須要注意下面的示例程序中使用了Jquery讀取HTML控件中配置的信息,例如TFS的地址、團隊項目名稱、帳戶和密碼等。post
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()
});
}visual-studio
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()
});
}ui
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