Использование httpClient.postasync для вызовов веб-API .netcore - PullRequest
0 голосов
/ 21 июня 2019

Я новичок в .netcore, я работаю над веб-API, работающими в Docker-контейнере, и, используя почтальон, веб-API работают очень хорошо, выводя результаты. Я хочу создать в .netcore программу, вызывающую конечные точки webapi и получающую ответ и использующую этот конкретный ответ в других конечных точках с MVC.

Объяснение приведено ниже. Имя пользователя и пароль по умолчанию для администратора заданы по умолчанию, например username:admin , password: helloworld , При первом входе администратора в API требуется новый личный пароль, как показано на рисунке Почтальона ниже.

API для входа в систему: localhost://..../v1/users/login Login Admin

Первый вопрос: как передать значения в Authorization-> BasicAuth, используя .netcore. Тело API выглядит как на рисунке ниже. Setting new_password for Admin

После установки new_password ответом API является токен, как показано ниже. Token Generated

Затем конкретный токен используется в среде для создания пользователя. Изображение для более ясной проблемы приведено ниже. Token Save

Наконец, токен затем используется для выполнения других вызовов API, таких как создание пользователя. API: https://localhost/..../v1/users Изображение ниже. Creating a User

Как новичок в языке .netcore, я действительно изо всех сил пытаюсь делать такого рода вызовы API, так как большинство обучающих программ, которые я попробовал, генерируют свой собственный токен из API, но здесь я просто хочу взять токен ответа и сохранить а затем использовать его в других вызовах API. Поддержка сообщества StackOverflow всегда была для меня очень полезна.

Код, который я пробую, приведен ниже.

**Controller**

 public class Login_AdminController : ControllerBase
    {
        [Route("/loginAdmin")]
        [HttpPost]
        public async Task<string> LoginAdminAsync([FromBody] dynamic content)
        {
            LoginAdmin L = new LoginAdmin();
            var client = new HttpClient();
            client.BaseAddress = new Uri("https://localhost:9090");
            var request = new HttpRequestMessage(HttpMethod.Post, "/v1/users/login");
            var byteArray = new UTF8Encoding().GetBytes($"<{L.username}:{L.df_Password}>");
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));

            var formData = new List<KeyValuePair<string, string>>();
            formData.Add(new KeyValuePair<string, string>("new_password", "helloWorld123!"));

            request.Content = new FormUrlEncodedContent(formData);
            var response = await client.SendAsync(request);
            Console.WriteLine(response);
            return content;
        }
   }
}
***Model***
    public class LoginAdmin
    {
        public string username = "admin";
        public string df_Password = "secret";
        public string new_Password { get; set; }
    }

Спасибо.

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Хотите получить токен из ответа?Если да.Попробуйте это:

var client = new HttpClient();
            client.BaseAddress = new Uri("http://localhost:12345/Api");
            var request = new HttpRequestMessage(HttpMethod.Post, "/token");

            var keyValues = new List<KeyValuePair<string, string>>();

            keyValues.Add(new KeyValuePair<string, string>("username", "yourusername"));
            keyValues.Add(new KeyValuePair<string, string>("password", "yourpassword"));

            request.Content = new FormUrlEncodedContent(keyValues);
            var response = client.SendAsync(request).Result;
            return response.Content.ReadAsStringAsync().Result;
0 голосов
/ 21 июня 2019

Авторизация осуществляется через заголовок запроса Authorization, который будет включать в себя некоторый токен с префиксом схемы. То, о чем вы здесь говорите, на самом деле не является базовым. При этом вы буквально передаете имя пользователя и передаете заголовок Authorization с каждым запросом. То, что вы делаете, это просто один раз аутентифицируете, чтобы получить токен авторизации, а затем используете этот токен для авторизации дальнейших запросов. В этом случае вы действительно должны опубликовать имя пользователя и передать тело запроса. Затем вы должны выполнить аутентификацию на предъявителя с токеном для других запросов, используя заголовок Authorization. Тем не менее, чтобы охватить обе базы:

Базовый Auth

var token = Convert.ToBase64String(Encoding.UTF8.GetBytes($"{username}:{password}"));
request.Headers.Add("Authorization", $"Basic {token}");

Auther Auth

request.Headers.Add("Authorization", $"Bearer {token}");
// where `token` is what was returned from your auth endpoint

FWIW, List<KeyValuePair<string, string>> - это просто Dictionary<string, string>. Лучше использовать реальный тип. Тогда вы можете просто сделать formData.Add("new_password", "helloWorld123!") вместо formData.Add(new KeyValuePair<string, string>("new_password", "helloWorld123!"))

...