VSTS REST API возвращает XML, когда он должен вернуть JSON - PullRequest
0 голосов
/ 06 июня 2018
class RestClient
    { public string endPoint { get; set; }

        public RestClient(string e)
        {
            endPoint = e;
        }
        public string makeRequest()
        {
            string strResponse = string.Empty;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(endPoint);
            request.Accept = "application/json";
            request.Credentials = HeaderTool.nCred;
            request.Method = "GET";

            using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
            {
                if (response.StatusCode != HttpStatusCode.OK)
                {
                    Console.WriteLine("Status code not ok");
                }
                //Process the response stream
                using (Stream responseStream = response.GetResponseStream())
                {
                    if (responseStream != null)
                    {
                        using (StreamReader reader = new StreamReader(responseStream))
                        {
                            strResponse = reader.ReadToEnd();
                        }
                    }
                }//End of responseStream scope
            }

            return strResponse;
        }//End of response scope
    }

Итак, я смотрю коммиты моего проекта на TFS с суффиксом /commits?searchCriteria.includeWorkItems=true&api-version=4.1, который работает. Что бы я ни делал, когда я печатаю вывод в консоли, онимеет XML.Я установил поле Accept в HttpWebRequest для application / json, но оно ничего не меняет. Я даже попытался добавить .json к uri

Я хочу вывод такого рода {"commitId": "SHA", "author": {"name": "Билл Най, научный парень", "электронная почта": "gmail@gmail.com", "date": "2018"}} Вы получаете именно это. Любая помощь очень ценится!

First part of output:


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">






<html lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
<head><title>

            Microsoft Team Foundation Server

</title><meta http-equiv="X-UA-Compatible" content="IE=11;&#32;IE=10;&#32;IE=9;&#32;IE=8" /><meta name="msapplication-config" content="none" />
    <link rel="SHORTCUT ICON" href="/tfs/favicon.ico"/>

1 Ответ

0 голосов
/ 06 июня 2018

Это не возвращает XML.Возвращается HTML .Это почти наверняка, потому что вы перенаправлены на страницу входа.Вы перенаправлены на страницу входа в систему, потому что вы не проходите аутентификацию должным образом.

Я не знаю значения HeaderTool.nCred, но это почти наверняка не правильно.Вы должны использовать личный токен аутентификации или токен OAuth для аутентификации в VSTS.

Существует клиентских библиотек , которые вы можете использовать для правильной аутентификации.Я бы порекомендовал реализовать их вместо того, чтобы свернуть свои собственные.

Вы также можете передать PAT для аутентификации через стандартные клиентские библиотеки HTTP.

Соответствующий фрагмент для вашего сценария:

public static async void GetBuilds()
{
    try
    {
        var personalaccesstoken = "PATFROMWEB";

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

            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic",
                Convert.ToBase64String(
                    System.Text.ASCIIEncoding.ASCII.GetBytes(
                        string.Format("{0}:{1}", "", personalaccesstoken))));

            using (HttpResponseMessage response = client.GetAsync(
                        "https://{account}.visualstudio.com/DefaultCollection/_apis/build-release/builds").Result)
            {
                response.EnsureSuccessStatusCode();
                string responseBody = await response.Content.ReadAsStringAsync();
                Console.WriteLine(responseBody);
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.ToString());
    }
}

Обратите внимание, что PAT кодируется в BASE64 и передается через заголовок аутентификации.

...