ОБНОВЛЕНИЕ: Azure DevOps API: отправка команд в REST API, которые JSON вместо URI - PullRequest
0 голосов
/ 18 июня 2020

Я немного новичок в использовании REST API для Azure DevOps, и он отлично работает, когда я могу отправлять свои запросы, которые в основном являются URI, которые я вижу на веб-сайте для API. Затем я получаю ответ JSON, де-сериализую его в класс из ответа JSON и выключаюсь.

Ниже приведен пример функции, которую я использую для получения рабочего элемента по его идентификатору. . Он использует URI с веб-сайта. Я также могу протестировать вещи, вставив URI в свой браузер, а затем посмотреть ответ.

Мой вопрос: как использовать команду для обновления рабочего элемента (например, Добавить ссылку), которая не является URI, который Я могу протестировать, вставив его в свой браузер. Вместо этого это сообщение JSON.

это веб-сайт API, на котором отображается сообщение JSON, необходимое для добавления ссылки на рабочий элемент. https://docs.microsoft.com/en-us/rest/api/azure/devops/wit/work%20items/update?view=azure-devops-rest-5.1#add -a-link

это сообщение JSON, которое они содержат для обновления ссылки на рабочий элемент: [{"op": "test", "path": " / rev "," value ": 3}, {" op ":" add "," path ":" / Relations / - "," value ": {" rel ":" System.LinkTypes.Dependency-forward ", "url": "https://dev.azure.com/fabrikam/_apis/wit/workItems/300", "attributes": {"comment": "Создание новой ссылки для зависимости"}}}]

Нужна ли мне другая функция для отправки JSON сообщение, а затем функция могла бы вернуть мне JSON Response? Я не могу найти пример того, как может выглядеть эта функция.

Мы будем очень признательны за любые советы о том, как отправить сообщение JSON вместо URI для получения ответа.

===================== ОБНОВЛЕНИЕ =====================

один ответ определенно помог мне наконец заработать. Я вставил обновленную функцию на случай, если она кому-то поможет. Я знаю, что найти для этого образцы VB. NET сложно. :)

СПАСИБО!

ОБНОВЛЕННЫЙ КОД ================================ ==========================

Public Async Function GetRequestAsync(ByVal uri As String, Optional ByVal jsonMessageBody As String = "") As Task(Of String())
    Dim client As HttpClient = New HttpClient()
    SetUpHttpClient(client)
    Dim statusCode As String = "NOTHING"
    Dim responseBody As String = "NOTHING"
    Try
        If jsonMessageBody.Length > 0 Then
            

'############## ############################################### ##### '### Для всех операций PATCH, которые имеют URI и сообщение JSON ###' ###################### ########################################### Dim patchValue = New StringContent (jsonMessageBody, Encoding.UTF8, "application / json -patch + json") Dim method = New HttpMethod ("PATCH") Dim request = New HttpRequestMessage (method, uri) With {.Content = patchValue} Тусклый ответ = client.SendAsyn c (запрос) .Result responseBody = response.Content.ReadAsStringAsyn c .Result () Else '##################### ############################### '### Для всех других операций, имеющих только URI ###' ############################################### ##### Использование ответа как HttpResponseMessage = client.GetAsyn c (uri) .Result statusCode = response.StatusCode.ToString () response.EnsureSuccessStatusCode () r esponseBody = response.Content.ReadAsStringAsyn c (). Result End Using End If Catch End Try Dim answer As String () = {statusCode, responseBody} Вернуть ответ End Function

Public Function GetTestCase(organization As String, project As String, TestCaseID As String) As WorkItemApi

    Dim dc As New DevCon.DevOpsConnector

    Dim response As String() = dc.GetRequest($"https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/{TestCaseID}?api-version=5.1&$expand=all")


    If response(0) <> "OK" Then
        Return Nothing
    End If

    Dim result As WorkItemApi = JsonConvert.DeserializeObject(Of WorkItemApi)(response(1))

    Return result

End Function


Public Async Function GetRequestAsync(ByVal getRequest As String) As Task(Of String())
    Dim client As HttpClient = New HttpClient()
    SetUpHttpClient(client)
    Dim statusCode As String = "NOTHING"
    Dim responseBody As String = "NOTHING"

    Try

        Using response As HttpResponseMessage = client.GetAsync(getRequest).Result


            statusCode = response.StatusCode.ToString()
            ' Console.WriteLine("Response: " & statusCode)
            response.EnsureSuccessStatusCode()
            responseBody = response.Content.ReadAsStringAsync().Result
        End Using

    Catch
    End Try

    Dim answer As String() = {statusCode, responseBody}
    Return answer
End Function

Ответы [ 2 ]

0 голосов
/ 20 июня 2020
Public Async Function GetRequestAsync(ByVal uri As String, Optional ByVal jsonMessageBody As String = "") As Task(Of String())
    Dim client As HttpClient = New HttpClient()
    client.DefaultRequestHeaders.Accept.Add(New MediaTypeWithQualityHeaderValue("application/json"))
    client.DefaultRequestHeaders.Authorization = New AuthenticationHeaderValue("Basic", _accessTokenHttpClient)
    Dim statusCode As String = "NOTHING"
    Dim responseBody As String = "NOTHING"
    Try
        If jsonMessageBody.Length > 0 Then
            '#####################################################################
            '###  For all PATCH operations that have a URI and a JSON message  ###
            '#####################################################################
            Dim patchValue = New StringContent(jsonMessageBody, Encoding.UTF8, "application/json-patch+json")
            Dim method = New HttpMethod("PATCH")
            Dim request = New HttpRequestMessage(method, uri) With {.Content = patchValue}
            Dim response = client.SendAsync(request).Result
            responseBody = response.Content.ReadAsStringAsync.Result()
        Else
            '#######################################################
            '###  For all other operations that have just a URI  ###
            '#######################################################
            Using response As HttpResponseMessage = client.GetAsync(uri).Result
                statusCode = response.StatusCode.ToString()
                response.EnsureSuccessStatusCode()
                responseBody = response.Content.ReadAsStringAsync().Result
            End Using
        End If
    Catch
    End Try
    Dim answer As String() = {statusCode, responseBody}
    Return answer
End Function
0 голосов
/ 18 июня 2020

Вам необходимо сериализовать массив полей в строку json. Проверьте следующий пример в C# с использованием класса HttpClient:

    public WorkItem CreateBugUsingHTTP()
    {
        string uri = _uri;
        string personalAccessToken = _personalAccessToken;
        string project = _project;
        string credentials = Convert.ToBase64String(System.Text.ASCIIEncoding.ASCII.GetBytes(string.Format("{0}:{1}", "", personalAccessToken)));

        Object[] patchDocument = new Object[4];

        patchDocument[0] = new { op = "add", path = "/fields/System.Title", value = "Authorization Errors" };
        patchDocument[1] = new { op = "add", path = "/fields/Microsoft.VSTS.TCM.ReproSteps", value = "Our authorization logic needs to allow for users with Microsoft accounts (formerly Live Ids) - http://msdn.microsoft.com/en-us/library/live/hh826547.aspx" };
        patchDocument[2] = new { op = "add", path = "/fields/Microsoft.VSTS.Common.Priority", value = "1" };
        patchDocument[3] = new { op = "add", path = "/fields/Microsoft.VSTS.Common.Severity", value = "2 - High" };

        using (var client = new HttpClient())
        {
            //set our headers
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);

            //serialize the fields array into a json string
            var patchValue = new StringContent(JsonConvert.SerializeObject(patchDocument), Encoding.UTF8, "application/json-patch+json");

            var method = new HttpMethod("POST");
            var request = new HttpRequestMessage(method, uri + "/" + project + "/_apis/wit/workitems/$Bug?api-version=5.1") { Content = patchValue };
            var response = client.SendAsync(request).Result;

            //if the response is successfull, set the result to the workitem object
            if (response.IsSuccessStatusCode)
            {
                var workItem = response.Content.ReadAsAsync<WorkItem>().Result;

                Console.WriteLine("Bug Successfully Created: Bug #{0}", workItem.Id);
                return workItem;
            }
            else
            {
                Console.WriteLine("Error creating bug: {0}", response.Content);
                return null;
            }
        }
    }

Вы можете начать работу из документации ниже:

https://docs.microsoft.com/en-us/rest/api/azure/devops/?view=azure-devops-rest-5.1

...