通过调用 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-page(有内容)没问题。那工作正常。
但我想编辑现有的。 tfs-documentation 表示 API 调用的唯一区别是使用“If-Match”-header(请参阅第 Request Header).
这里我有3种情况:
- 使用 no "If-Match"-Header 或空的:得到一个“412 Precondition Failed”错误.
- 使用 "If-Match"-Header 和 随机值 :出现“400 Bad Request”错误.
- 使用 "If-Match"-Header 正好 40 个字符(如 page-revision 的 version-hash(例如 ' 09f62be600a3b6d36d21b294dbb00921a5ba03ec')): 再次出现“412 Precondition Failed”错误。
我认为 revision-hash(40 个字符)应该是一个好方法,因为非 40 字符的错误消息 returns 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
header 是必需的。 If-Matchth
的值是 wiki 页面 ETag。
ETags can also be used for optimistic concurrency control, as a way to help prevent simultaneous updates of a resource from overwriting each other
所以我们需要在更新前获取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;
测试结果:
我想使用此文档更新现有的 tfs wiki 页面: https://docs.microsoft.com/de-de/rest/api/azure/devops/wiki/pages/create%20or%20update?view=azure-devops-rest-4.1
新建wiki-page(有内容)没问题。那工作正常。 但我想编辑现有的。 tfs-documentation 表示 API 调用的唯一区别是使用“If-Match”-header(请参阅第 Request Header).
这里我有3种情况:
- 使用 no "If-Match"-Header 或空的:得到一个“412 Precondition Failed”错误.
- 使用 "If-Match"-Header 和 随机值 :出现“400 Bad Request”错误.
- 使用 "If-Match"-Header 正好 40 个字符(如 page-revision 的 version-hash(例如 ' 09f62be600a3b6d36d21b294dbb00921a5ba03ec')): 再次出现“412 Precondition Failed”错误。
我认为 revision-hash(40 个字符)应该是一个好方法,因为非 40 字符的错误消息 returns 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
header 是必需的。 If-Matchth
的值是 wiki 页面 ETag。
ETags can also be used for optimistic concurrency control, as a way to help prevent simultaneous updates of a resource from overwriting each other
所以我们需要在更新前获取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;
测试结果: