Я новичок в 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. Пожалуйста, помогите просветить, что отсутствует/неправильно.
@Jason: добавив новую задачу? Не могли бы вы привести простой пример?
Нет, просто сохраните токен существующим методом. Вероятно, было бы лучше сделать HttpHelper одноэлементным или, по крайней мере, сделать свойство токена статическим. Тут уже поздно мне пример приводить, может завтра
Используйте 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
Надеюсь это поможет.!
Если вы хотите использовать его в каждом запросе, я бы просто сохранил его в классе HttpHelper. Нет необходимости распространять его на виртуальную машину каждый раз