我正在尝试使用C#和TFS的REST API向特定环境发布版本。
我获得了用于执行请求的代码,但是我不知道如何组织补丁请求的参数。
public void LaunchRelease(string tfsServerIncludingCollection, string personalAccessToken, string projectName, int releaseId, int environmentId)
{
var releaseUrl = $"{tfsServerIncludingCollection}/{projectName}/_apis/release/releases/{releaseId}/environments/{environmentId}";
var base64Token = Convert.ToBase64String(Encoding.ASCII.GetBytes($":{personalAccessToken}"));
var patchDocument = new Object[1];
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Token);
var patchValue = new StringContent(JsonConvert.SerializeObject(patchDocument), Encoding.UTF8, "application/json-patch+json");
var method = new HttpMethod("PATCH");
var request = new HttpRequestMessage(method, releaseUrl) { Content = patchValue };
var response = client.SendAsync(request).Result;
if (response.IsSuccessStatusCode)
{
var result = response.Content.ReadAsStringAsync().Result;
}
}
}
我已经在互联网上看到它应该类似于(取自另一个示例):
patchDocument[0] = new { op = "replace", path = "/relations/attributes/comment", value = "Adding traceability to dependencies" };
但是我不知道如何将其与PATCH操作所需的参数结合起来。有想法吗?
更新:通过在浏览器上重放TFS请求,我看到用于内部请求的API是3.2-preview.4
然后进入邮递员,我可以成功创建请求。我导出了C#内容,并将其包含在VS中(它使用Restsharp)。而且有效。
var client = new RestClient("http://MYURL/tfs/MyCollection/MyProj/_apis/Release/releases/3329/environments/11719?api-version=3.2-preview.4");
var request = new RestRequest(Method.PATCH);
request.AddHeader("postman-token", "3f94c3a4-da61-9487-8aeb-7238b4355a77");
request.AddHeader("cache-control", "no-cache");
request.AddHeader("content-type", "application/json");
request.AddHeader("authorization", "Basic MyToken");
request.AddParameter("application/json", "{\"status\":2,\"scheduledDeploymentTime\":null,\"comment\":null}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
尽管进行了相关更改,但仍然无法使原始代码正常工作。这是当前代码
public async Task<string> LaunchRelease(string tfsServerIncludingCollection, string personalAccessToken, string projectName, int releaseId, int environmentId)
{
//Create the URI with the environment to deploy to:
var releaseUrl = $"{tfsServerIncludingCollection}/{projectName}/_apis/release/releases/{releaseId}/environments/{environmentId}?api-version=3.2-preview.4";
//Create the patch Document
var patchDocument = new
{
status = 2,
};
var json = JsonConvert.SerializeObject(patchDocument);
var patchContent = new StringContent(json, Encoding.UTF8, "application/json-patch+json");
using (var client = new HttpClient())
{
var base64Token = Convert.ToBase64String(Encoding.ASCII.GetBytes($":{personalAccessToken}"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Token);
var method = new HttpMethod("PATCH");
var request = new HttpRequestMessage(method, releaseUrl) { Content = patchContent };
var response = await client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
var result = await response.Content.ReadAsStringAsync();
return result;
}
return null;
}
}
我可以使用RestSharp,但我想知道为什么它在一种情况下有效,而在另一种情况下无效。
答案 0 :(得分:1)
这里的假设是environmentId
是要部署到的环境。
我在这里关注了这篇文章
引用VSTS/TFS REST API: The basics and working with builds and releases
使用PowerShell执行API请求。
我只是将其调整为您已经提供的代码。
public async Task LaunchRelease(string tfsServerIncludingCollection, string personalAccessToken, string projectName, int releaseId, int environmentId) {
//Create the URI with the environment to deploy to:
var releaseUrl = $"{tfsServerIncludingCollection}/{projectName}/_apis/release/releases/{releaseId}/environments/{environmentId}?api-version=3.2-preview.4";
//Create the patch Document
var patchDocument = new {
status = 2
};
var json = JsonConvert.SerializeObject(patchDocument);
var patchContent = new StringContent(json, Encoding.UTF8, "application/json");
using (var client = new HttpClient()) {
var base64Token = Convert.ToBase64String(Encoding.ASCII.GetBytes($":{personalAccessToken}"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Token);
var method = new HttpMethod("PATCH");
var request = new HttpRequestMessage(method, releaseUrl) { Content = patchContent };
var response = await client.SendAsync(request);
if (response.IsSuccessStatusCode) {
var result = await response.Content.ReadAsStringAsync();
//...
}else {
var error = await response.Content.ReadAsStringAsync();
//...
}
}
}
记下文章
如果在部署环境尚未批准之前获得了部署前的批准,则需要在此之前致电该PATCH请求。
我还检查了官方文档,以确认请求正文中的预期参数。