ИСПРАВЛЕНИЕ рабочего элемента VSO API, дающее 400 неверных запросов

Я работаю с Visual Studio Online REST API и могу заставить все работать, кроме создания рабочего элемента. Это не локальная установка. Я следую этому примеру и отправляю PATCH, но получаю ошибку 400 Bad Request. Создать рабочий элемент VSO

Для скрипача это мой необработанный запрос:

    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);
    }


}

person Papa Burgundy    schedule 13.04.2015    source источник
comment
Привет, сэр, не могли бы вы опубликовать полный пример кода для моей справки? Я использую JavascriptSerializer для отправки запроса на исправление.   -  person Prasaanth Neelakandan    schedule 15.03.2016
comment
@PrasaanthNeelakandan, посмотрим, поможет ли это   -  person Papa Burgundy    schedule 16.03.2016
comment
У меня почти такой же код, который не работает... stackoverflow.com/questions/36023821/   -  person Prasaanth Neelakandan    schedule 16.03.2016
comment
на этот вопрос я также попробовал первый ответ. Я использовал POSTMAN для проверки запроса на исправление, и он вернул, что запрошенный ресурс не поддерживает метод http «PATCH»   -  person Prasaanth Neelakandan    schedule 16.03.2016
comment
Я пытаюсь обновить поле и не создавать рабочий элемент w, хотя   -  person Prasaanth Neelakandan    schedule 16.03.2016
comment
Я знаю, что вы пробовали это много месяцев назад... но не могли бы вы просто направить? Я пробовал кучу комбинаций JSON. Не уверен, что это формат JSON, который вызывает это   -  person Prasaanth Neelakandan    schedule 16.03.2016


Ответы (2)


Все примеры выглядят так, как будто они отправляют массив операций, а не одну операцию. Не знаю, требование это или нет. Но, возможно, он ожидает, что тело PATCH будет массивом.

Не могли бы вы попробовать отправить:

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

и посмотреть, работает ли это?

person Tim    schedule 13.04.2015
comment
Спасибо, Тим, я даже не заметил этого, но, глядя сейчас, ты можешь быть прав. Позвольте мне попробовать. - person Papa Burgundy; 13.04.2015
comment
Это сделало это! Оплошность с моей стороны, спасибо, сэр, за свежий взгляд. - person Papa Burgundy; 13.04.2015
comment
@PapaBurgundy, можете ли вы поделиться своей окончательной реализацией C # для создания запроса RestSharp? спасибо - person Scott Decker; 16.03.2016
comment
@scottndecker посмотрим, поможет ли это - person Papa Burgundy; 16.03.2016
comment
@PapaBurgundy Это действительно так. Тем временем я смог понять это и в итоге реализовал что-то подобное, где я создаю список элементов, сериализую их (вот где добавляется отсутствующий []), а затем ИСПРАВЛЯЮ это в VSTS. Спасибо, что поделился! Просто любопытно, для чего вы, ребята, используете VSTS Rest API? Не похоже, что многие используют его, но мне пока нравится - person Scott Decker; 16.03.2016
comment
@scottndecker мы тестируем идею коммуникации с пользователями. В настоящее время мы предлагаем страницу поддержки в одном из наших приложений, к которой имеет доступ владелец приложения. Они могут представить идею для новой функции или ошибки. Он автоматически отображается как рабочий элемент в моем списке в VSTS. Я даю им всем тег «Создано пользователем», чтобы знать, что это исходит от них. Кроме того, в VSTS вы можете настроить отправку уведомлений по электронной почте при добавлении нового рабочего элемента. Так что с ним довольно весело играть. Нам пока понравилось. - person Papa Burgundy; 17.03.2016
comment
OMG большое спасибо за этот ответ. Копался в этом часами. - person Beth Crane; 15.06.2018

Изменение application/json на application/json-patch+json, похоже, помогло мне.

person hambone    schedule 05.01.2017