使用Azure DevOps Rest API重命名文件



我正在创建一个Azure函数,用于重命名Azure DevOps存储库中的文件,但需要"oldObjectId",这是Get-Commits API调用(即(的最后一个"commitId">

得到https://dev.azure.com/{organization}/{project}/_apis/git/restores/{repositoryId}/提交?api版本=6.0

我正在本地和通过PostMan测试代码,但不知道在请求的主体中包含什么,因为没有为此指定任何内容。

我对C#和Azure函数还很陌生,不知道如何在自己的项目中正确实现它。如果有人能指引我走向正确的方向,我将不胜感激。

我使用的是带有.NET Core 3.0和Azure函数的Visual Studio。

这是迄今为止的代码:


using System;
using System.IO;
using System.Net;
using Microsoft.Azure.WebJobs;
using Newtonsoft.Json;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
namespace FileRename
{
public static class Rename
{
private static bool flgFileRenamed;
private static bool flgRepoCommit;
[FunctionName("RenameFunction")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]
HttpRequest req, ILogger log)
{
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic body = JsonConvert.DeserializeObject(requestBody);

string devOpsUsername = Environment.GetEnvironmentVariable("DevOpsUsername", EnvironmentVariableTarget.Process);
string devOpsPAT = Environment.GetEnvironmentVariable("DevOpsPAT", EnvironmentVariableTarget.Process);
string serviceEndpointId = Environment.GetEnvironmentVariable("ServiceEndpointId", EnvironmentVariableTarget.Process);
string sourceRepoUrl = Environment.GetEnvironmentVariable("SourceRepoUrl", EnvironmentVariableTarget.Process);
string baseTargetUri = Environment.GetEnvironmentVariable("BaseTargetUri", EnvironmentVariableTarget.Process);
string RepoId = "1bfc406f-5dd7-44e1-b5fc-bd14829fbb12";
using HttpClient client = new HttpClient();
{
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", devOpsUsername, devOpsPAT))));

// Get Latest Commits to the Repository
var latestCommittsRequestBody = new
{
};
//GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/commits?searchCriteria.$top=1&api-version=6.1-preview.1
var latestCommittsUrl = baseTargetUri + "git/repositories/" + RepoId + "/commits?searchCriteria.$top=1&api-version=6.1-preview.1";

HttpRequestMessage latestCommittsRequest = new HttpRequestMessage(HttpMethod.Get, latestCommittsUrl);
latestCommittsRequest.Content = new StringContent(JsonConvert.SerializeObject(latestCommittsRequestBody), Encoding.UTF8, "application/json");
//var CommitId = body.value.commitId;
// latest Commits Response
using HttpResponseMessage latestCommittsResponse = await client.SendAsync(latestCommittsRequest);
{
if (latestCommittsResponse.StatusCode == HttpStatusCode.Created)
{
flgRepoCommit = true;
}
else
{
flgRepoCommit = false;
}
}

// Rename a File
var renameFileRequestBody = new
{
refUpdates = new
{
name = "refs/heads/master",
oldObjectId = body.value.commitId,
},
commits = new
{
comment = "Renaming ABC.txt to XYZ.txt",
changes = new
{
changeType = "rename",
sourceServerItem = "/ABC.txt",
item = new
{
path = "/XYZ.txt",
}
},
}
};
var renameFileUrl = baseTargetUri + "git/repositories/" + RepoId + "/pushes?api-version=6.0-preview.1";
HttpRequestMessage renameFileRequest = new HttpRequestMessage(HttpMethod.Post, renameFileUrl);
renameFileRequest.Content = new StringContent(JsonConvert.SerializeObject(renameFileRequestBody), Encoding.UTF8, "application/json");
using HttpResponseMessage renameFileResponse = await client.SendAsync(renameFileRequest);
{
if (renameFileResponse.StatusCode == HttpStatusCode.Created)
{
flgFileRenamed = true;
}
else
{
flgFileRenamed = false;
}
}
// Checks if file is renamed or not 
if (flgFileRenamed == true)
{
return new OkObjectResult("File is renamed successfully!"); // 200                      
}
else
{
return new BadRequestObjectResult("File could not be renamed successfully."); // 400
}
}
}
}
}

关于这个问题,请参考以下代码

Client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", "", PAT))));
var requestMessage = new HttpRequestMessage(HttpMethod.Get, "https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/commits?api-version=6.0-preview.1&searchCriteria.$top=1");
string content = string.Empty;
using (HttpResponseMessage response = await Client.SendAsync(requestMessage))
{
if (!response.IsSuccessStatusCode)
{
try
{
response.EnsureSuccessStatusCode();
}
catch (HttpRequestException ex)
{
throw ex;
}

}
var res = await response.Content.ReadAsStringAsync();
JObject resObj = JsonConvert.DeserializeObject<JObject>(res);
var commitId = (resObj["value"].Last).Value<string>("commitId");
log.LogInformation("commitId: "+ commitId);
var renameFileRequestBody = new
{
refUpdates = new Object[] {
new {
name = "refs/heads/master",
oldObjectId = commitId,
},
},

commits =new Object[] {
new{
comment = "Renaming test.txt to mytest.txt",
changes = new Object[]{
new{
changeType = "rename",
sourceServerItem = "/test.txt",
item = new
{
path = "/mytest.txt",
}
},
}
}

}
};
HttpRequestMessage renameFileRequest = new HttpRequestMessage(HttpMethod.Post, "https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/pushes?api-version=6.1-preview.2");
renameFileRequest.Content = new StringContent(JsonConvert.SerializeObject(renameFileRequestBody), Encoding.UTF8, "application/json");
using (HttpResponseMessage renameFileResponse=await  Client.SendAsync(renameFileRequest))
{
if (renameFileResponse.StatusCode == HttpStatusCode.Created)
{
return new OkObjectResult("File is renamed successfully!");
}
else
{
return new BadRequestObjectResult("File could not be renamed successfully."); // 400
}

}

最新更新