Получить токен из ответа на вход в API и передать запрос заголовка API Заголовок другого меню в Xamarin Forms

Я новичок в Xamarin Forms iOS и хочу получить значение токена после входа в систему.

Я прочитал документацию: https://learn.microsoft.com/en-us/xamarin/xamarin-forms/enterprise-application-patterns/authentication-and-authorization Но я не знаю, с чего начать, чтобы применить в моем коде.

Это то, что я сделал до сих пор. (ответный логин сработал)

Тело ответа после успешного входа в систему:

{
  "message": "Login success",
  "token": "2|yQa9L51Fo1OpMx8zJSK2AegnDVJWjacJ6IbfEE2e",
  "store_id": 1
}

APIResponse.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace App88.Models
{
    public class APIResponse
    {
        public string message { get; set; }
        public string token { get; set; }
        public int store_id { get; set; }
    }

}

HttpHelper.cs

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using App88.Models;

namespace App88.Helpers
{
    public class HttpHelper
    {

        public async Task<APIResponse> callAPI(string url, string json)
        {
            APIResponse res = new APIResponse();
            try
            {
                string content = string.Empty;
                var httpClient = new HttpClient();
                HttpResponseMessage httpResponse = null;
                if (String.IsNullOrWhiteSpace(json))
                {
                    httpResponse = await httpClient.GetAsync(url);
                }
                else
                {
                    var httpContent = new StringContent(json, Encoding.UTF8, "application/json");
                    httpResponse = await httpClient.PostAsync(url, httpContent);

                }

                if (httpResponse.IsSuccessStatusCode)
                {
                    content = await httpResponse.Content.ReadAsStringAsync();
                    res = JsonConvert.DeserializeObject<APIResponse>(content);
                }
                else
                {
                    res.message = "Invalid Response";
                }

                return res;
            }
            catch (Exception ex)
            {
                res.message = ex.Message.ToString();
                return res;
            }
        }



    }
}

Логинвиевмодел.cs

using App88.Helpers;
using App88.Models;
using App88.Views;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using Xamarin.Forms;

namespace App88.ViewModels
{
    public class LoginViewModel : BaseViewModel
    {
        public ICommand btnLogin { get; set; }
        private UsersModel _users { get; set; }

        private string _message { get; set; }
        public string message
        {
            get
            { return _message; }
            set
            {
                _message = value;
                OnPropertyChanged();
            }
        }

        public UsersModel users
        {
            get { return _users; }
            set
            {
                _users = value;
                OnPropertyChanged();
            }
        }

        private bool _isActivity { get; set; }

        public bool isActivity
        {
            get { return _isActivity; }
            set
            {
                _isActivity = value;
                OnPropertyChanged();
            }
        }
        public LoginViewModel()
        {
            users = new UsersModel();
            users.email = "";
            message = "Please enter your credentials to proceed";
            btnLogin = new Command(async () => await userLogin());
        }

        private async Task userLogin()
        {
            try
            {
                string webURL = APIHelper.loginAPI;
                HttpHelper httpHelper = new HttpHelper();
                isActivity = true;
                APIResponse res = await httpHelper.callAPI(webURL, JsonConvert.SerializeObject(users));
                isActivity = false;
                if (res.message == "Login success")
                {
                    LoginResponseDetails details = new LoginResponseDetails();
                    string obj = JsonConvert.SerializeObject(res);
                    details = JsonConvert.DeserializeObject<LoginResponseDetails>(obj);

                    Application.Current.MainPage = new NavigationPage(new Dashboard(details));

                }
                else
                    message = res.message;

                isActivity = false;
            }
            catch (Exception ex)
            {
                isActivity = false;
                message = ex.Message.ToString();
            }
        }
    }

    
}

VMDashboard.cs

using App88.Models;
using System;
using System.Collections.Generic;
using System.Text;

namespace App88.ViewModels
{
    public class VMDashboard : BaseViewModel
    {

        private LoginResponseDetails _loginResponseDetails { get; set; }

        public LoginResponseDetails loginResponseDetails
        {
            get { return _loginResponseDetails; }
            set
            {
                _loginResponseDetails = value;
                OnPropertyChanged();
            }
        }

        public VMDashboard(LoginResponseDetails detail)
        {
            loginResponseDetails = detail;

        loginResponseDetails.message = detail.message;
        loginResponseDetails.token = detail.token; //token value successfully landed here!
        loginResponseDetails.store_id = detail.store_id;
    }


}

}

Документация API в Postman.

Я хочу получить предыдущий токен ответа на вход пользователя и сделать его заголовком авторизации в GET Procurement List. Пожалуйста, помогите просветить, что отсутствует/неправильно.

Если вы хотите использовать его в каждом запросе, я бы просто сохранил его в классе HttpHelper. Нет необходимости распространять его на виртуальную машину каждый раз

Jason 28.11.2022 04:29

@Jason: добавив новую задачу? Не могли бы вы привести простой пример?

danielpr 28.11.2022 04:59

Нет, просто сохраните токен существующим методом. Вероятно, было бы лучше сделать HttpHelper одноэлементным или, по крайней мере, сделать свойство токена статическим. Тут уже поздно мне пример приводить, может завтра

Jason 28.11.2022 05:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
155
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте Xamarin.Essentials, чтобы сохранить значение Token при успешном входе в систему. Пожалуйста, получите его значение, как показано ниже, когда вам нужно передать его в заголовок.

Класс Preferences помогает хранить настройки приложения в хранилище ключей/значений.

Чтобы сохранить значение:

Preferences.Set("my_key", "my_value");

Чтобы получить значение:

var myValue = Preferences.Get("my_key", "default_value");

Чтобы узнать больше о настройках: https://learn.microsoft.com/en-us/xamarin/essentials/preferences?tabs=android

Надеюсь это поможет.!

Другие вопросы по теме