gpt4 book ai didi

rest - 使用 REST api 创建一个新的团队项目

转载 作者:行者123 更新时间:2023-12-05 04:15:37 26 4
gpt4 key购买 nike

整个星期我都在努力反对这个问题。使用 REST api 创建新的团队项目。无论我看哪里,响应都是一样的,而且总是涉及使用命令行和 xml。

但为什么呢?

在 visual studio 在线页面上可以找到:

https://www.visualstudio.com/en-us/integrate/api/tfs/projects

(具体看标有“创建团队项目”的部分)

那既然不能用,为什么还要存在呢?还是我遗漏了什么?

如果有人知道使用它的任何示例,我将不胜感激。

我一直在使用 Microsoft.TeamFoundation.WorkItemTracking.Client 命名空间等...并且很高兴为项目创建新的工作项

我什至还设法使用 API 来下拉项目列表。使用此示例中的代码(滚动到页面底部)

https://www.visualstudio.com/en-us/integrate/get-started/rest/basics

但我不能为我的生活发布一个新的团队项目。

此时我愿意接受任何建议,我在这里创建了一个帐户只是为了询问(我喜欢这个网站):(

根据要求,一些代码:

static async Task<string> PostProjectAsync(HttpClient _client, string _apiUrl, string _apiVersion)
{
var responseBody = string.Empty;

HttpContent hc = new StringContent(@"
{
""name"": ""Testprojectfromconsole"",
""description"": ""Posted from console application using the tfs API""
}
");
//TODO: make a class that matches the json layout that the api is expecting
//then see if you have any better luck with that instead of this horrid horrid mess

ProjectPost newproj = new ProjectPost();
newproj.Name = @"Test Project -From console";
newproj.Description = @"Hopefully this has been posted from the console app, delete it later on if need be.";
newproj.Capabilities.VersionControl.SourceControlType = @"TFS"; //probably wrong
newproj.Capabilities.ProcessTemplate.TemplateTypeId = @"default"; //also probably wrong

string json = JsonConvert.SerializeObject(newproj);

try
{
using (HttpResponseMessage response = _client.PostAsync(_apiUrl + _apiVersion, hc).Result)
{
response.EnsureSuccessStatusCode();
responseBody = await response.Content.ReadAsStringAsync();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}

return responseBody;
}

目前我正在将一个名为“hc”的 HttpContent 传递给 postasync,但是如果我将它切换为 json 对象,postasync 将停止工作(因为它需要 httpcontent 而不是 json)

在调用这个方法之前,客户端是这样设置的:

client.DefaultRequestHeaders.Accept.Add(
new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));



//Set alternate credentials
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
Convert.ToBase64String(
System.Text.ASCIIEncoding.ASCII.GetBytes(
string.Format("{0}:{1}", ALTUSERNAME, ALTPASSWORD))));

Console.WriteLine("<--------------Getting projects from tfs!-------------->");
Console.WriteLine("<----------------Hold on to your butts!---------------->");

responseBody = await GetAsync(client, BASEURL + "projects", APIVERS);

Console.WriteLine(responseBody.ToString());

Console.WriteLine("<----------------Making a new project!----------------->");
Console.WriteLine("<----------------Hold on to your butts!---------------->");

responseBody = await PostProjectAsync(client, BASEURL + "projects", APIVERS);

Console.WriteLine(responseBody.ToString());

哦,URL 是这样的:

static string PN1 = @"Test Project -From Web";
static string PN2 = @"Another Test Project -From Web";
static string COL = @"DefaultCollection";

static string BASEURL = "https://{0}.visualstudio.com/DefaultCollection/_apis/";

// Get the alternate credentials that you'll use to access the Visual Studio Online account.
static string ALTUSERNAME = "myusername";
static string ALTPASSWORD = "mypassword!";



//Your visual studio account name
static string ACCOUNT = "ourserver";

//Api version query parameter
static string APIVERS = "?api-version=1.0";

最佳答案

这是我使用过的代码。这是为 .net 3.5 制作的,但我找到了 .net 4.5.1 的解决方案:

private const string PROJECT_TEMPLATE_AGILE = "adcc42ab-9882-485e-a3ed-7678f01f66bc";
private const string PROJECT_TEMPLATE_SCRUM = "6b724908-ef14-45cf-84f8-768b5384da45";
private const string PROJECT_TEMPLATE_CMMI = "27450541-8e31-4150-9947-dc59f998fc01";

VsoTeamProject project = new VsoTeamProject(
newFolderName,
comment,
new Capabilities(new VersionControl("Tfvc"), new ProcessTemplate(projectTemplateId)));

CreateTeamProject(project, "POST", false); // this calls PostResponse method

这里是主要方法:

private void PostResponse(VsoTeamProject project, string method, bool useProjectName)
{
string projectState = "wellFormed";
if(method.Equals("DELETE"))
{
projectState = "deleting";
}

var requestUriString = ConstructUrl(
useProjectName ? project.TeamProjectId : string.Empty,
string.Empty,
new Dictionary<string, object>());
var httpWebRequest = (HttpWebRequest)WebRequest.Create(requestUriString);
httpWebRequest.ContentType = "application/json";
httpWebRequest.Method = method;
string autorization = TFSImplementor.LoginName + ":" + TFSImplementor.Password;
byte[] binaryAuthorization = Encoding.UTF8.GetBytes(autorization);
autorization = Convert.ToBase64String(binaryAuthorization);
autorization = "Basic " + autorization;
httpWebRequest.Headers.Add("AUTHORIZATION", autorization);

if(method.Equals("POST"))
{
using(var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
string json = JsonConvert.SerializeObject(project);

streamWriter.Write(json);
}
}

try
{
var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
if(httpResponse.StatusCode == HttpStatusCode.Accepted)
{
Task<WebResponse> responseTask = Task.Factory.FromAsync<WebResponse>(httpWebRequest.BeginGetResponse, httpWebRequest.EndGetResponse, null);
using(var responseStream = responseTask.Result.GetResponseStream())
{
var reader = new StreamReader(responseStream);
var t = reader.ReadToEnd();
ProjectStatus json = JsonConvert.DeserializeObject<ProjectStatus>(t);
if(json.status.Equals("queued"))
{
while(true)
{
if(CheckTeamProjectState(project.ProjectName, true, projectState))
{
break;
}
}
}
}
}
}
catch(WebException e)
{
using(WebResponse response = e.Response)
{
using(Stream data = response.GetResponseStream())
{
using(var reader = new StreamReader(data))
{
string text = reader.ReadToEnd();
Logger.Error(text);
Logger.Exception(e);
if(method.Equals("DELETE"))
{
throw new Exception("Failed to delete project, check log for more details");
}

throw new Exception("Failed to create project, check log for more details");
}
}
}
}
}

以下是您可以使用的类:

private class VsoTeamProject
{
#region Fields

private readonly string m_name;

private readonly string m_comment;

private readonly string m_teamProjectId;

private readonly Capabilities m_capabilities;

#endregion

#region Constructors

public VsoTeamProject(string teamProjectId, string name)
{
m_teamProjectId = teamProjectId;
m_name = name;
}

public VsoTeamProject(string projectName, string description, Capabilities capabilities)
{
m_name = projectName;
m_comment = description;
m_capabilities = capabilities;
}

#endregion

#region Properties

[JsonProperty("name")]
protected internal string ProjectName
{
get
{
return m_name;
}
}

[JsonProperty("description")]
protected internal string Description
{
get
{
return m_comment;
}
}

protected internal string TeamProjectId
{
get
{
return m_teamProjectId;
}
}

[JsonProperty("capabilities")]
protected internal Capabilities Capabilities
{
get
{
return m_capabilities;
}
}

#endregion
}

private class ProjectStatus
{
public string id { get; set; }

public string status { get; set; }

public string url { get; set; }

public string name { get; set; }

public string state { get; set; }

public string message { get; set; }
}

private class Capabilities
{
public Capabilities(VersionControl versionControl, ProcessTemplate template)
{
VersionControl = versionControl;
ProcessTemplate = template;
}

[JsonProperty("processTemplate")]
public ProcessTemplate ProcessTemplate { get; private set; }

[JsonProperty("versioncontrol")]
public VersionControl VersionControl { get; private set; }
}

private class VersionControl
{
public VersionControl(object type)
{
SourceControlType = type;
}

[JsonProperty("sourceControlType")]
public object SourceControlType { get; private set; }
}

private class ProcessTemplate
{
public ProcessTemplate(string templateTypeId)
{
TemplateTypeId = templateTypeId;
}

[JsonProperty("templateTypeId")]
public string TemplateTypeId { get; private set; }
}

我有这个 PostResponse 方法也用于从 VSO 中删除项目。它就像一个魅力。

关于rest - 使用 REST api 创建一个新的团队项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31744123/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com