簡體   English   中英

通過調用 rest-api 更新 tfs 的 wiki 頁面

[英]Update wiki page of tfs by calling rest-api

我想使用此文檔更新 tfs 的現有 wiki 頁面: https ://docs.microsoft.com/de-de/rest/api/azure/devops/wiki/pages/create%20or%20update?view = azure-devops-rest-4.1

創建一個新的 wiki 頁面(帶有內容)是沒有問題的。 那工作正常。 但我想編輯一個現有的。 tfs-documentation 說 API 調用的唯一區別是使用“ If-Match ”-header(請參閱部分Request Header )。

我這里有3種情況:

  • 使用沒有“如果-匹配” -Header或空:獲得“412預處理失敗”的錯誤。
  • 使用具有隨機值的“If-Match”-Header:獲得“ 400 Bad Request ”錯誤。
  • 使用恰好 40 個字符的“If-Match”-Header(如頁面修訂的版本哈希(例如'09f62be600a3b6d36d21b294dbb00921a5ba03ec')):再次出現“ 412 Precondition Failed ”錯誤。

我認為修訂哈希(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;

根據Create or Update Wiki API ,如果我們要編輯 wiki 頁面,則需要If-Match標頭。 If-Matchth的值是維基頁面 ETag。

ETag還可以用於樂觀並發控制,作為一種幫助防止資源的同時更新相互覆蓋的方法

所以我們需要在更新前獲取wiki 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;

測試結果:

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM