通过调用rest-api更新tfs的wiki页面

时间:2019-01-28 14:59:44

标签: rest api tfs put azure-devops-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文档说API调用的唯一区别是使用“ If-Match ”标头(请参见Request Header部分)。

这里我有3种情况:

  • 使用“如果匹配”-标题或空白:出现“ 412前提条件失败”错误。
  • 使用具有随机值的“如果匹配”标头:出现“ 400错误的请求”错误。
  • 使用带有正好40个字符的“如果匹配”标头(例如页面修订的版本哈希(例如'09f62be600a3b6d36d21b294dbb00921a5ba03ec')):再次“ 412前提条件失败”错误。

我认为使用修订哈希值(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 :(得分: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;

测试结果:

enter image description here