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 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?> GetJsonAsync(string url, TRequest value) { string parameter = ChangeToString(value); var response = await http.GetFromJsonAsync>($"{url}?{parameter}"); return response; } public async Task<(bool success, string? json, T? data)> GetConnectServerAsnyc(string url) { var headerValue = await storageService.GetItemAsync("Web-AM-Connect-Key"); if (string.IsNullOrEmpty(headerValue)) return (false, null,default); var args = new { url = $"{url}", method = "GET", headerKey = "Web-AM-Connect-Key", headerValue = headerValue, token = "VO00" }; var response = await js.InvokeAsync( "fetchWithHeaderAndReturnUrl", args ); LoggerService.Write($"JSON 응답: {response.ToString()}"); if (response.TryGetProperty("data", out var dataElement)) { try { // 전체 데이터 암호화 저장 var dataJson = dataElement.ToString(); var serialData = JsonSerializer.Deserialize(dataJson, new JsonSerializerOptions { PropertyNameCaseInsensitive = true }); LoggerService.Write("[GetConnectServerAsnyc] 사용자 데이터 Json: " + dataJson + dataJson.GetType()); LoggerService.Write("[GetConnectServerAsnyc] 사용자 데이터 변환: " + serialData.ToString());; if (serialData != null) { var encryptedData = await secureService.EncryptAsync(dataJson); // await storageService.SetItemAsync("USER_DATA", encryptedData); return (true, encryptedData, serialData); } else { LoggerService.Write("사용자 데이터에 필수 정보가 없습니다"); } } catch (Exception ex) { LoggerService.Write($"사용자 데이터 처리 중 오류: {ex.Message}"); } } LoggerService.Write("데이터를 찾을 수 없습니다"); return (false, null, default); } } /* dynamic 타입을 사용하면: 타입 안전성이 떨어집니다 컴파일 타임에 오류를 잡을 수 없습니다 런타임에 예상치 못한 오류가 발생할 수 있습니다 현재 Register.razor.cs에서 JsonElement를 사용하는 방식이 더 안전할 수 있습니다. 왜냐하면: JSON 응답의 구조를 명시적으로 확인할 수 있습니다 (TryGetProperty 사용) 각 속성의 타입을 명확하게 처리할 수 있습니다 예상치 못한 데이터 구조에 대해 더 안전하게 대응할 수 있습니다 */