尝试将REST请求发送到TFS时为什么会出现404错误?

时间:2018-12-20 13:00:23

标签: c# rest tfs

我试图通过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);

1 个答案:

答案 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”。