【问题标题】:VSO API Work Item PATCH giving 400 Bad RequestVSO API 工作项补丁给出 400 错误请求
【发布时间】:2015-06-18 21:17:09
【问题描述】:

我正在使用 Visual Studio Online REST API,除了创建工作项外,我似乎可以让一切正常工作。这不是本地安装。我按照这个示例发送了一个 PATCH,但收到了 400 Bad Request 错误。 VSO Create Work Item

每个提琴手,这是我的原始请求:

    PATCH https://xxx.visualstudio.com/defaultcollection/myproject/_apis/wit/workitems/$Task?api-version=1.0 HTTP/1.1
Accept: application/json
Authorization: Basic RmI3etc_etc_etc==
Content-Type: application/json-patch+json; charset=utf-8
Host: xxx.visualstudio.com
Content-Length: 101
Expect: 100-continue
Connection: Keep-Alive

{"op":"add","path":"/fields/System.Title","value":"JavaScript implementation for Microsoft Account"}

我得到的响应是 400 Bad Request:

{"$id":"1","innerException":null,"message":"You must pass a valid patch document in the body of the request.","typeName":"Microsoft.VisualStudio.Services.Common.VssPropertyValidationException, Microsoft.VisualStudio.Services.Common, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03ftoken0a3a","typeKey":"VssPropertyValidationException","errorCode":0,"eventId":3000}

我不知道为什么它说补丁文件无效。

更新:根据请求,仅共享更多代码。我修补了自己的图书馆。这是我为轻松将工作项添加到项目(产品积压、错误等)所做的工作

public void AddWorkItem(VSOWorkItem workItem, string project)
    {
        Project = project;

        using (HttpClient client = new HttpClient())
        {
            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}", UserName, Password))));

            var workItems = new List<VSOFieldPatch>();
            workItems.Add(new VSOFieldPatch() { Op = "add", Path = "/fields/" + VSOWorkItemFieldName.Title, Value = workItem.Title });
            workItems.Add(new VSOFieldPatch() { Op = "add", Path = "/fields/" + VSOWorkItemFieldName.Description, Value = workItem.Description });

            if (!string.IsNullOrEmpty(workItem.Tags))
                workItems.Add(new VSOFieldPatch() { Op = "add", Path = "/fields/" + VSOWorkItemFieldName.Tags, Value = workItem.Tags });

            var resp = AddWorkItemAsync(client, workItems, BaseProjectUrl + "wit/workitems/$" + workItem.WorkItemType.ToString());
        }

    }


 private async Task<String> AddWorkItemAsync(HttpClient client,
                                      IEnumerable<VSOFieldPatch> data,
                                      String apiUrl)
    {
        var responseBody = String.Empty;

        var temp = JsonConvert.SerializeObject(data);

        var content = new StringContent(
            JsonConvert.SerializeObject(data),
            Encoding.UTF8,
            "application/json-patch+json");

        try
        {
            using (HttpResponseMessage response = client.PatchAsync(apiUrl + ApiVersion, content).Result)
            {
                response.EnsureSuccessStatusCode();
                responseBody = await response.Content.ReadAsStringAsync();
            }
        }
        catch (Exception ex)
        {

        }

        return responseBody;
    }

这是我的 PATCH 扩展:

public static class HttpClientExtensions
{

    public static Task<HttpResponseMessage> PatchAsync(this HttpClient client, string requestUri, HttpContent content)
    {
        HttpRequestMessage request = new HttpRequestMessage
        {
            Method = new HttpMethod("PATCH"),
            RequestUri = new Uri(client.BaseAddress + requestUri),
            Content = content,
        };

        return client.SendAsync(request);
    }


}

【问题讨论】:

  • 您好先生,您能发布完整的示例代码供我参考吗?我正在使用 JavascriptSerializer 发送补丁请求。
  • @PrasaanthNeelakandan 看看是否有帮助
  • 我有几乎完全相同的代码,但不起作用...stackoverflow.com/questions/36023821/…
  • 那个问题我也尝试了第一个答案。我使用 POSTMAN 检查 Patch 请求,它返回“请求的资源不支持 http 方法 'PATCH'”
  • 我正在尝试更新字段而不是创建 w 工作项

标签: c# rest api azure-devops azure-devops-rest-api


【解决方案1】:

所有示例看起来都在发送一系列操作,而不仅仅是单个操作。我不知道这是否是一个要求。但也许它期望 PATCH 的主体是一个数组。

您可以尝试发送吗:

[{"op":"add","path":"/fields/System.Title","value":"JavaScript implementation for Microsoft Account"}]

看看它是否有效?

【讨论】:

  • 谢谢蒂姆,我什至没有注意到,但现在看起来你可能是对的。让我试一试。
  • 做到了!我的监督,谢谢您,先生,您的眼睛焕然一新。
  • @PapaBurgundy 你能分享一下你最终的 C# 实现是什么来构建 RestSharp 请求吗?谢谢
  • @scottndecker 看看是否有帮助
  • @PapaBurgundy 确实如此。与此同时,我能够弄清楚它并最终实现了类似的东西,我构建了一个项目列表,将它们序列化(这就是添加缺少的 [] 的地方),然后将其修补到 VSTS。感谢分享!只是好奇,你们使用 VSTS Rest API 是为了什么?似乎没有很多人在使用它,但到目前为止我喜欢它
【解决方案2】:

将 application/json 更改为 application/json-patch+json 似乎对我有用。

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 2015-03-14
    • 2021-10-01
    • 2020-05-21
    相关资源
    最近更新 更多