using System.Collections.Generic; using System.Text; using System.Text.Json; using System.Text.Json.Serialization; namespace economy.Models.Lotto { public class LottoModel { private readonly DhlotteryCoKR _dhlotteryCoKR; public LottoModel(DhlotteryCoKR dhlotteryCoKR) { _dhlotteryCoKR = dhlotteryCoKR; } // 로또 당첨 번호 조회 /* public async Task GetLottoNumber(Request request) { Response parseData = new(); try { var uriBuilder = new UriBuilder(_dhlotteryCoKR.APIUrl) { Path = "/common.do", Query = $"method=getLottoNumber&drwNo={request.Number}" }; var response = await _dhlotteryCoKR.httpClient.GetAsync(uriBuilder.Uri); // 요청 실패면 바로 예외 발생 -> 아래 파싱 로직으로 진행하지 않음 response.EnsureSuccessStatusCode(); var bytes = await response.Content.ReadAsByteArrayAsync(); // 가능한 경우 서버가 반환한 charset 사용, 없으면 euc-kr를 기본으로 시도 string? charset = response.Content.Headers.ContentType?.CharSet; Encoding encoding; try { encoding = !string.IsNullOrWhiteSpace(charset) ? Encoding.GetEncoding(charset) : Encoding.GetEncoding("euc-kr"); } catch { // 지원하지 않는 인코딩이면 UTF8로 폴백 encoding = Encoding.UTF8; } var content = encoding.GetString(bytes); // 응답이 HTML(예: 에러 페이지)로 왔는지 간단히 검사 var firstNonWhitespace = content?.TrimStart().FirstOrDefault(); if (firstNonWhitespace == '<') { Console.WriteLine("API 응답이 JSON이 아닌 HTML로 반환되었습니다. 원본 응답(일부):"); Console.WriteLine(content.Length > 2000 ? content[..2000] : content); return new Response(); } try { parseData = JsonSerializer.Deserialize(content) ?? new Response(); } catch (JsonException je) { // JSON 파싱 에러 시 원본 응답을 로그에 남기고 안전하게 빈 결과 반환 Console.WriteLine("JSON 파싱 실패. 응답 내용(일부):"); Console.WriteLine(content.Length > 2000 ? content[..2000] : content); Console.WriteLine($"파싱 예외: {je.Message}"); return new Response(); } } catch (HttpRequestException e) { Console.WriteLine($"Request error: {e.Message}"); } return parseData; } */ public async Task GetLottoNumber(Request request) { Response parseData = new(); try { var uriBuilder = new UriBuilder(_dhlotteryCoKR.APIUrl) { Path = "/lt645/selectPstLt645Info.do", Query = $"srchStrLtEpsd={request.Number}&srchEndLtEpsd={request.Number}" }; var response = await _dhlotteryCoKR.httpClient.GetAsync(uriBuilder.Uri); // 요청 실패면 바로 예외 발생 -> 아래 파싱 로직으로 진행하지 않음 response.EnsureSuccessStatusCode(); var bytes = await response.Content.ReadAsByteArrayAsync(); // 가능한 경우 서버가 반환한 charset 사용, 없으면 euc-kr를 기본으로 시도 string? charset = response.Content.Headers.ContentType?.CharSet; Encoding encoding; try { encoding = !string.IsNullOrWhiteSpace(charset) ? Encoding.GetEncoding(charset) : Encoding.GetEncoding("euc-kr"); } catch { encoding = Encoding.UTF8; // 지원하지 않는 인코딩이면 UTF8로 폴백 } var content = encoding.GetString(bytes); var jsonOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true, NumberHandling = JsonNumberHandling.AllowReadingFromString }; try { parseData = JsonSerializer.Deserialize(content, jsonOptions) ?? new Response(); } catch (JsonException je) { // JSON 파싱 에러 시 원본 응답을 로그에 남기고 안전하게 빈 결과 반환 Console.WriteLine("JSON 파싱 실패. 응답 내용(일부):"); Console.WriteLine(content.Length > 2000 ? content[..2000] : content); Console.WriteLine($"파싱 예외: {je.Message}"); return new Response(); } } catch (HttpRequestException e) { Console.WriteLine($"Request error: {e.Message}"); } return parseData; } } }