我试图通过REST API在本地TFS中创建任务,但始终会收到404错误。有人知道我使用的是正确的URI,什么是正确的URI,或者我做错了其他任何事情吗?
我遵循https://docs.microsoft.com/de-de/rest/api/azure/devops/wit/work%20items/create?view=vsts-rest-tfs-4.1上的各种教程,并因此下载了他们的示例项目。但是这些都没有帮助我摆脱404。 TFS的基本URI是正确的,我可以通过浏览器对其进行处理。
JsonPatchDocument createStoryRequest = new JsonPatchDocument();
createStoryRequest.Add(
new JsonPatchOperation()
{
Operation = Operation.Add,
Path = "/fields/System.Title",
Value = storyToCreate.Fields.Title
}
);
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "", ApiCredentials.tfsAuthenticationToken))));
Task postJsonTask = Task.Run(async () =>
{
using (HttpResponseMessage response = await client.PostAsJsonAsync(
"https://my_tfs_server/tfs/DefaultCollection/_apis/wit/workitems/$task?api-version=4.1",
createStoryRequest))
{
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
System.Console.WriteLine(responseBody);
}
});
Task.WaitAll(new Task[] { postJsonTask});
}
我希望在我的TFS上创建一个故事/任务/任何内容,但是无论我尝试什么,我总是得到404。
感谢您的帮助!
编辑1: 感谢大家的帮助!解决方案是API版本:TFS2018仅支持API版本4.0,并且在给出另一个API版本时,将给出所描述的404错误。 Identify the version for your TFS Identify the API version 并使用以下代码(以及RestSharp NuGet包):
var client = new RestClient("https://my_tfs_server/tfs/DefaultCollection/PROJECTNAME/_apis/wit/workitems/$User Story?api-version=4.0");
client.Authenticator = new HttpBasicAuthenticator("", ApiCredentials.tfsAuthenticationToken);
var request = new RestRequest(Method.POST);
request.AddHeader("cache-control", "no-cache");
request.AddHeader("Content-Type", "application/json-patch+json");
request.AddParameter("undefined", "[{\"op\": \"add\", \"path\": \"/fields/System.Title\", \"value\": \"" + storyToCreate.Fields.Title + "\" }]", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
答案 0 :(得分:1)
根据here的版本4.1的API说明,正确的POST命令是:
POST https://{instance}/{collection}/{project}/_apis/wit/workitems/${type}?api-version=4.1
因此,与您的样本相比,我认为您错过了收集后的项目名称。
所以应该是这样的:
using (HttpResponseMessage response = await client.PostAsJsonAsync(
"https://my_tfs_server/tfs/DefaultCollection/PROJECTNAME/_apis/wit/workitems/$task?api-version=4.1",
createStoryRequest))
{
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
System.Console.WriteLine(responseBody);
}
修改:
因此,必须对URL进行调整以包括项目名称:
“ https://my_tfs_server/tfs/DefaultCollection/PROJECTNAME/_apis/wit/workitems/ $ task?api-version = 4.1”,其中“ PROJECTNAME”应该是您的团队项目的名称。
如果不带项目名称使用,则似乎会得到404;如果指定了不存在的项目,则会出现此项目不存在的错误。
Edit2:
根据{{3}},您的TFS版本与TFS 2018 RTM有关,后者根据github上的this post支持4.0版本的REST API。
到目前为止使用的示例使用的是api版本4.1,显然它不受支持。
4.1之前的REST API的文档有些隐藏,但是此comment应该提供正确的规范。看来您必须提供PATCH请求:
PATCH https://{instance}/DefaultCollection/{project}/_apis/wit/workitems/${workItemTypeName}?api-version={version}
请求的正文应包含JSON格式的字段的值:
[
{
"op": "add",
"path": { string }
"value": { string or int, depending on the field }
},
{
"op": "add",
"path": "/relations/-",
"value":
{
"rel": { string },
"url": { string },
"attributes":
{
{ name/value pairs }
}
}
}
]
因此api版本应为4.0。
EDIT3 :(按问题发帖人),我的媒体类型也不对。 “ application / json”将导致“错误请求”响应。正确的媒体类型是“ application / json-patch + json”。