Asp.Net Core - Выполнение вызовов API из бэкэнда - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть приложение, которое вызывает API из бэкэнд-класса cs, используя IHostedService.С базовыми вызовами API ("http://httpbin.org/ip") он работает нормально и возвращает правильное значение, однако теперь мне нужно вызвать API-интерфейс Siemens, который требует от меня установить заголовок авторизации и поместить" grant_type = client_credentials "в тело".

 public async Task<string> GetResult()
    {
        string data = "";
        string baseUrl = "https://<space-name>.mindsphere.io/oauth/token";

        using (HttpClient client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", {ServiceCredentialID: ServiceCredentialSecret});

            using (HttpResponseMessage res = await client.GetAsync(baseUrl))
            {

                using (HttpContent content = res.Content)
                {

                    data = await content.ReadAsStringAsync();
                }
            }
        }

Я думаю, что заголовок настроен правильно, но я не буду знать наверняка, пока полный запрос не будет отформатирован. Можно ли вообще установить тело запроса на "grant_type =client_credentials "?

1 Ответ

0 голосов
/ 19 сентября 2018

Насколько я вижу из документации Siemens API, они ожидают данные формы, поэтому они должны быть такими:

public async Task<string> GetResult()
{
    string data = "";
    string baseUrl = "https://<space-name>.mindsphere.io/oauth/token";

    using (HttpClient client = new HttpClient())
    {
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", {ServiceCredentialID: ServiceCredentialSecret});

        var formContent = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("grant_type", "client_credentials")
        });

        using (HttpResponseMessage res = await client.PostAsync(baseUrl, formContent))
        {

            using (HttpContent content = res.Content)
            {    
                data = await content.ReadAsStringAsync();
            }
        }
    }
}
...