Обновите вики-страницу tfs, вызвав rest-api - PullRequest
0 голосов
/ 28 января 2019

Я хочу обновить уже существующую вики-страницу tfs, используя этот документ: https://docs.microsoft.com/de-de/rest/api/azure/devops/wiki/pages/create%20or%20update?view=azure-devops-rest-4.1

Создание новой вики-страницы (с контентом) не составляет проблем.Это работает нормально.Но я хочу отредактировать существующий.В документации tfs говорится, что единственная разница в вызове API заключается в использовании заголовка " If-Match " (см. Раздел Заголовок запроса ).

Здесь у меня есть 3 ситуации:

  • Использование нет Заголовок «If-Match» или пустой: Получить « 412 Сбой предварительного условия *»1018 * "ошибка.
  • Использование заголовка" If-Match "с случайным значением : получить ошибку" 400 Bad Request".
  • Использование заголовка «If-Match» с точно 40 символами (например, хэш версии ревизии страницы (например, '09f62be600a3b6d36d21b294dbb00921a5ba03ec')): снова " 412 Не выполнено предварительное условие "error.

Я думаю, что хеш-версия (40 символов) должна быть хорошим способом, потому что сообщение об ошибке на не-40-символьных значениях возвращает ошибку 400.

Ноэто не работает?У кого-нибудь есть идея, которой хочет id tfs?Я использовал Postman и C # для обновления через API.Ниже вы можете увидеть мой пример кода:

var handler = new HttpClientHandler()
{
    UseDefaultCredentials = true,
    UseProxy = false,
};

var client = new HttpClient(handler);
client.BaseAddress = new Uri(".../pages/pagename" + "?api-version=4.1");
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

var putContent = new StringContent("{ \"content\": \"New content for page\" }", Encoding.UTF8, "application/json");

client.DefaultRequestHeaders.TryAddWithoutValidation("If-Match", "09f62be600a3b6d36d21b294dbb00921a5ba03ec");

var responseTask = client.PutAsync(client.BaseAddress, putContent);

var result = responseTask.Result;
var content = result.Content.ReadAsStringAsync().Result;

var code = result.StatusCode;
var body = content;

1 Ответ

0 голосов
/ 29 января 2019

Согласно Create или Update Wiki API , если мы хотим редактировать вики-страницу, требуется заголовок If-Match.Значение If-Matchth - это вики-страница ETag.

ETags также можно использовать для оптимистичного управления параллелизмом, чтобы предотвратить перезапись друг друга при одновременном обновлении ресурса

, поэтомунам нужно получить Etag вики перед обновлением.Попробуйте изменить код следующим образом:

var baseUrl = "xxxxx";
var handler = new HttpClientHandler()
            {
                UseDefaultCredentials = true,
                UseProxy = false,
            };

var client = new HttpClient(handler)
            {
                BaseAddress = new Uri(baseUrl)
            };
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", "YourToken");
var getResult = client.GetAsync(baseUrl).Result;
var etag = getResult.Headers.GetValues("ETag");
var putContent = new StringContent("{ \"content\": \"New content for page\" }", Encoding.UTF8, "application/json");
client.DefaultRequestHeaders.TryAddWithoutValidation("If-Match", etag);
var responseTask = client.PutAsync(client.BaseAddress, putContent);
var result = responseTask.Result;
var content = result.Content.ReadAsStringAsync().Result;

Результат теста:

enter image description here

...