Почему я получаю ошибку 404 при попытке отправить REST-запрос в TFS? - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь создавать задачи в моей локальной TFS через REST API, но я всегда получаю ошибку 404.Кто-нибудь знает, если я использую правильный URI, каким будет правильный URI, или я делаю что-то еще неправильно?

Я следовал различным учебникам по https://docs.microsoft.com/de-de/rest/api/azure/devops/wit/work%20items/create?view=vsts-rest-tfs-4.1 и по этой причине скачал их пример проекта.Но ничто из этого не помогло мне избавиться от моего 404. Базовый URI TFS верен, я могу работать с ним через браузер.

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 и выдаст ошибку 404, описанную при предоставлении другой версии API. Определите версию для вашего TFS Определите версию API И используйте следующий код (и пакет 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 голосов
/ 20 декабря 2018

В соответствии с описанием API версии 4.1, которое можно найти здесь правильная команда 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:
Согласно этой записи ваша версия TFS относится к TFS 2018 RTM, которая поддерживает REST API в версии 4.0в соответствии с comment на github.
Используемые до сих пор примеры используют API-версию 4.1, которая, очевидно, не поддерживается.
Документы для REST API до 4.1 немного скрыты, однако это ссылка должна предоставитьправильная спецификация.Создается впечатление, что вы должны предоставить запрос 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.

РЕДАКТИРОВАТЬ3: (постером вопроса) также мой медиатип был неверным.«application / json» приведет к ответу «неверный запрос».Правильный тип носителя: «application / json-patch + json».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...