forked from AcaMate/AcaMate_Web
93 lines
3.4 KiB
C#
93 lines
3.4 KiB
C#
using System.Net.Http.Json;
|
|
using System.Text.Encodings.Web;
|
|
using System.Text.Json;
|
|
using Front.Program.Models;
|
|
using Microsoft.JSInterop;
|
|
|
|
namespace Front.Program.Services;
|
|
|
|
public class APIService(HttpClient http,
|
|
StorageService storageService,
|
|
SecureService secureService,
|
|
IJSRuntime js)
|
|
{
|
|
|
|
|
|
private string ChangeToString<T>(T data)
|
|
{
|
|
if (data == null) return string.Empty;
|
|
var properties = typeof(T).GetProperties();
|
|
var value = properties.Select(p => $"{p.Name}={p.GetValue(data)}");
|
|
return string.Join("&", value);
|
|
}
|
|
|
|
public async Task<APIResponseStatus<TResponse>?> GetJsonAsync<TResponse,TRequest>(string url, TRequest value)
|
|
{
|
|
string parameter = ChangeToString(value);
|
|
var response = await http.GetFromJsonAsync<APIResponseStatus<TResponse>>($"{url}?{parameter}");
|
|
return response;
|
|
}
|
|
|
|
public async Task<(bool success,T? data)> GetConnectServerAsnyc<T>(string url) {
|
|
var headerValue = await storageService.GetItemAsync("Web-AM-Connect-Key");
|
|
if (string.IsNullOrEmpty(headerValue)) return (false, default);
|
|
|
|
var args = new {
|
|
url = $"{url}",
|
|
method = "GET",
|
|
headerKey = "Web-AM-Connect-Key",
|
|
headerValue = headerValue,
|
|
token = "VO00"
|
|
};
|
|
|
|
var response = await js.InvokeAsync<JsonElement>(
|
|
"fetchWithHeaderAndReturnUrl",
|
|
args
|
|
);
|
|
|
|
Console.WriteLine($"JSON 응답: {response.ToString()}");
|
|
|
|
if (response.TryGetProperty("data", out var dataElement))
|
|
{
|
|
try
|
|
{
|
|
// 전체 데이터 암호화 저장
|
|
var dataJson = dataElement.ToString();
|
|
var serialData = JsonSerializer.Deserialize<T>(dataJson,
|
|
new JsonSerializerOptions { PropertyNameCaseInsensitive = true });
|
|
Console.WriteLine("[GetConnectServerAsnyc] 사용자 데이터 Json: " + dataJson);
|
|
Console.WriteLine("[GetConnectServerAsnyc] 사용자 데이터 변환: " + serialData.ToString());;
|
|
|
|
if (serialData != null)
|
|
{
|
|
var encryptedData = await secureService.EncryptAsync(dataJson);
|
|
await storageService.SetItemAsync("USER_DATA", encryptedData);
|
|
return (true, serialData);
|
|
}
|
|
else
|
|
{
|
|
Console.WriteLine("사용자 데이터에 필수 정보가 없습니다");
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine($"사용자 데이터 처리 중 오류: {ex.Message}");
|
|
}
|
|
}
|
|
|
|
Console.WriteLine("데이터를 찾을 수 없습니다");
|
|
return (false, default);
|
|
}
|
|
|
|
}
|
|
|
|
/*
|
|
dynamic 타입을 사용하면:
|
|
타입 안전성이 떨어집니다
|
|
컴파일 타임에 오류를 잡을 수 없습니다
|
|
런타임에 예상치 못한 오류가 발생할 수 있습니다
|
|
현재 Register.razor.cs에서 JsonElement를 사용하는 방식이 더 안전할 수 있습니다. 왜냐하면:
|
|
JSON 응답의 구조를 명시적으로 확인할 수 있습니다 (TryGetProperty 사용)
|
|
각 속성의 타입을 명확하게 처리할 수 있습니다
|
|
예상치 못한 데이터 구조에 대해 더 안전하게 대응할 수 있습니다
|
|
*/ |