我想通过使用此文档来更新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文档说API调用的唯一区别是使用“ If-Match ”标头(请参见Request Header部分)。
这里我有3种情况:
我认为使用修订哈希值(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;
答案 0 :(得分:0)
根据Create or Update Wiki API,如果我们要编辑Wiki页面,则需要If-Match
标头。 If-Matchth
的值是Wiki页面ETag。
ETags 也可以用于乐观并发控制,以帮助防止资源的同时更新相互覆盖
,因此我们需要在更新之前获取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;
测试结果: