KLingo Project Documentation 1.0.0
Unreal Engine 5.6 C++ Project Documentation
로딩중...
검색중...
일치하는것 없음
UKLingoNetworkSystem 클래스 참조

KLingo 서버와의 HTTP 요청을 중재하는 게임 인스턴스 서브시스템입니다. 더 자세히 ...

#include <UKLingoNetworkSystem.h>

+ UKLingoNetworkSystem에 대한 상속 다이어그램 :
+ UKLingoNetworkSystem에 대한 협력 다이어그램:

Public 멤버 함수

 DEFINE_SUBSYSTEM_GETTER_INLINE (UKLingoNetworkSystem)
 
virtual void Deinitialize () override
 등록된 델리게이트를 정리하고 서브시스템을 종료합니다.
 
virtual void Initialize (FSubsystemCollectionBase &Collection) override
 HTTP 모듈 초기화 및 네트워크 대기 카운터를 설정합니다.
 
void RequestChatAudio (const FString &Context, const FString &AudioPath, FResponseChatAnswersDelegate InDelegate)
 Chat 답변을 요청합니다 (음성 질문).
 
void RequestChatQuestion (const FString &Context, const FString &Question, FResponseChatAnswersDelegate InDelegate)
 Chat 답변을 요청합니다 (텍스트 질문).
 
void RequestDailyAudio (const FString &Context, const FString &AudioPath, FResponseChatDailysDelegate InDelegate)
 Daily Chat 답변을 요청합니다 (음성 질문).
 
void RequestDailyQuestion (const FString &Context, const FString &Question, FResponseChatDailysDelegate InDelegate)
 Daily Chat 답변을 요청합니다 (텍스트 질문).
 
void RequestEvaluationResult (int32 RoomId, FResponseEvaluationResultDelegate InDelegate)
 Evaluation 결과를 조회합니다.
 
void RequestInterviewAnswer (const FRequestInterviewAnswer &Answer, FResponseInterviewAnswerDelegate InDelegate)
 인터뷰 답변 제출 요청을 전송합니다.
 
void RequestInterviewHello (FResponseInterviewHelloDelegate InDelegate)
 인터뷰 시작 요청을 전송합니다.
 
void RequestListenAudio (const FString &AudioText, FResponseListenAudioDelegate InDelegate)
 Listen 음성 생성 요청을 전송합니다.
 
void RequestListenResult (const FRequestListenResult &Result, FResponseListenResultDelegate InDelegate)
 Listen 결과 제출 요청을 전송합니다.
 
void RequestListenScenario (FResponseListenScenarioDelegate InDelegate)
 Listen 시나리오 조회 요청을 전송합니다.
 
void RequestReadResult (const FRequestReadResult &Result, FResponseReadResultDelegate InDelegate)
 Read 결과 제출 요청을 전송합니다.
 
void RequestReadScenario (FResponseReadScenarioDelegate InDelegate)
 Read 시나리오 조회 요청을 전송합니다.
 
void RequestSpeakingJudges (const FString &Question, const FString &AudioPath, FResponseSpeakingJudesDelegate InDelegate)
 Speaking 평가 요청을 전송합니다.
 
void RequestSpeakResult (const FRequestSpeakResult &Result, FResponseSpeakResultDelegate InDelegate)
 Speak 결과 제출 요청을 전송합니다.
 
void RequestSpeakScenario (FResponseSpeakScenarioDelegate InDelegate)
 Speak 시나리오 조회 요청을 전송합니다.
 
void RequestUserMe (FResponseUserMeDelegate InDelegate)
 현재 사용자 정보를 조회합니다.
 
void RequestUserRegister (const FString &UserName, FResponseUserRegisterDelegate InDelegate)
 사용자 등록 요청을 전송합니다.
 
void RequestUserToken (const FString &UserName, FResponseUserTokenDelegate InDelegate)
 사용자 토큰 발급 요청을 전송합니다.
 
void RequestWriteQuestions (FResponseWriteQuestionDelegate InDelegate)
 Write 문제 목록을 요청합니다.
 
void RequestWriteResult (const FRequestWriteResult &Result, FResponseWriteResultDelegate InDelegate)
 Write 결과 제출 요청을 전송합니다.
 
void RequestWriteSubmit (const TArray< FString > &ImagePathArray, TArray< FString > InTargetText, FResponseWriteSubmitDelegate InDelegate)
 Write 제출 요청을 전송합니다.
 

Private 멤버 함수

void AddNetworkWaitCount (int Value)
 네트워크 처리 대기 카운트를 갱신하고 UI에 통보합니다.
 
TSharedRef< IHttpRequest, ESPMode::ThreadSafe > SetupHttpRequest (const FString &Url, const FString &Verb)
 
void ShowLoadingCircle (bool bShow)
 LoadingCircle을 표시하거나 숨깁니다.
 
void ShowNetworkErrorPopup (int32 ResponseCode, const FString &ResponseContent)
 네트워크 에러 팝업을 표시합니다.
 

정적 Private 멤버 함수

static const TCHAR * GetLogPrefix (ENetworkLogType InLogType)
 요청 타입에 맞는 로그 접두사를 반환합니다.
 
static bool IsResSuccess (const int InCode)
 
static void LogNetwork (ENetworkLogType InLogType, const FString &URL, const FString &Body=TEXT(""))
 공통 네트워크 로그 메시지를 출력합니다.
 

Private 속성

FString access_token
 인증 토큰 (로그인 후 저장)
 
int NetworkWaitCount = 0
 처리 중인 요청 수를 집계하는 카운터입니다.
 

상세한 설명

KLingo 서버와의 HTTP 요청을 중재하는 게임 인스턴스 서브시스템입니다.

학습/퀘스트/채팅 등 여러 API 요청의 공통 진입점으로 사용됩니다. 요청 처리 중 로딩 UI 및 오류 팝업을 관리하며, 응답은 델리게이트로 전달됩니다. 사용 위치: 네트워크 요청이 필요한 게임플레이/학습 UI 전반.

UKLingoNetworkSystem.h 파일의 28 번째 라인에서 정의되었습니다.

멤버 함수 문서화

◆ AddNetworkWaitCount()

void UKLingoNetworkSystem::AddNetworkWaitCount ( int  Value)
private

네트워크 처리 대기 카운트를 갱신하고 UI에 통보합니다.

매개변수
Value[in] 증감할 값입니다.

UKLingoNetworkSystem.cpp 파일의 77 번째 라인에서 정의되었습니다.

78{
79 NetworkWaitCount += Value;
80
81 UWorld* World = GetWorld();
82 if (!IsValid(World))
83 {
84 PRINTLOG( TEXT("[Network] Invalid World in AddNetworkWaitCount."));
85 return;
86 }
87
88 if ( auto BroadcastManager = UBroadcastManager::Get(World) )
89 BroadcastManager->SendNetworkWaitCount(NetworkWaitCount);
90}
#define PRINTLOG(fmt,...)
Definition GameLogging.h:30
int NetworkWaitCount
처리 중인 요청 수를 집계하는 카운터입니다.

다음을 참조함 : NetworkWaitCount, PRINTLOG.

다음에 의해서 참조됨 : RequestListenScenario(), RequestReadScenario(), RequestSpeakScenario(), RequestUserMe(), RequestUserRegister(), RequestUserToken().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ DEFINE_SUBSYSTEM_GETTER_INLINE()

UKLingoNetworkSystem::DEFINE_SUBSYSTEM_GETTER_INLINE ( UKLingoNetworkSystem  )

◆ Deinitialize()

void UKLingoNetworkSystem::Deinitialize ( )
overridevirtual

등록된 델리게이트를 정리하고 서브시스템을 종료합니다.

잔여 네트워크 요청 상태를 정리해 안전하게 종료합니다. 사이드이펙트: 내부 상태를 해제하고 UI 대기 상태를 정리합니다.

UKLingoNetworkSystem.cpp 파일의 41 번째 라인에서 정의되었습니다.

42{
43 Super::Deinitialize();
44}

◆ GetLogPrefix()

const TCHAR * UKLingoNetworkSystem::GetLogPrefix ( ENetworkLogType  InLogType)
staticprivate

요청 타입에 맞는 로그 접두사를 반환합니다.

UKLingoNetworkSystem.cpp 파일의 58 번째 라인에서 정의되었습니다.

59{
60 switch (InLogType)
61 {
62 case ENetworkLogType::Get: return TEXT("[GET]");
63 case ENetworkLogType::Post: return TEXT("[POST]");
64 case ENetworkLogType::WS: return TEXT("[WS]");
65 default: return TEXT("[UNKNOWN]");
66 }
67}
@ Post
HTTP POST 요청을 나타냅니다.
@ WS
WebSocket 메시지를 나타냅니다.
@ Get
HTTP GET 요청을 나타냅니다.

다음을 참조함 : Get, Post, WS.

다음에 의해서 참조됨 : LogNetwork().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ Initialize()

void UKLingoNetworkSystem::Initialize ( FSubsystemCollectionBase &  Collection)
overridevirtual

HTTP 모듈 초기화 및 네트워크 대기 카운터를 설정합니다.

서브시스템 시작 시 요청 상태 추적을 준비하기 위한 초기화 단계입니다. 사이드이펙트: 내부 카운터 및 요청 대기 상태를 초기화합니다.

UKLingoNetworkSystem.cpp 파일의 35 번째 라인에서 정의되었습니다.

36{
37 Super::Initialize(Collection);
39}

다음을 참조함 : NetworkWaitCount.

◆ IsResSuccess()

bool UKLingoNetworkSystem::IsResSuccess ( const int  InCode)
staticprivate

UKLingoNetworkSystem.cpp 파일의 69 번째 라인에서 정의되었습니다.

70{
71 if ( InCode == 200 || InCode == 201 )
72 return true;
73 return false;
74}

다음에 의해서 참조됨 : RequestEvaluationResult(), RequestListenScenario(), RequestReadScenario(), RequestSpeakScenario(), RequestUserMe(), RequestUserRegister(), RequestUserToken().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ LogNetwork()

void UKLingoNetworkSystem::LogNetwork ( ENetworkLogType  InLogType,
const FString &  URL,
const FString &  Body = TEXT("") 
)
staticprivate

공통 네트워크 로그 메시지를 출력합니다.

매개변수
InLogType[in] 로그 타입입니다.
URL[in] 요청 URL입니다.
Body[in] 요청 본문입니다 (선택사항).

UKLingoNetworkSystem.cpp 파일의 46 번째 라인에서 정의되었습니다.

47{
48 if (!Body.IsEmpty())
49 {
50 NETWORK_LOG(TEXT("%s %s | Body: %s"), GetLogPrefix(InLogType), *Message, *Body);
51 }
52 else
53 {
54 NETWORK_LOG(TEXT("%s %s"), GetLogPrefix(InLogType), *Message);
55 }
56}
#define NETWORK_LOG(fmt,...)
static const TCHAR * GetLogPrefix(ENetworkLogType InLogType)
요청 타입에 맞는 로그 접두사를 반환합니다.

다음을 참조함 : GetLogPrefix(), NETWORK_LOG.

다음에 의해서 참조됨 : RequestChatAudio(), RequestChatQuestion(), RequestDailyAudio(), RequestDailyQuestion(), RequestEvaluationResult(), RequestInterviewAnswer(), RequestInterviewHello(), RequestListenAudio(), RequestListenResult(), RequestListenScenario(), RequestReadResult(), RequestReadScenario(), RequestSpeakingJudges(), RequestSpeakResult(), RequestSpeakScenario(), RequestUserMe(), RequestUserRegister(), RequestUserToken(), RequestWriteQuestions(), RequestWriteResult(), RequestWriteSubmit().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:
+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ RequestChatAudio()

void UKLingoNetworkSystem::RequestChatAudio ( const FString &  Context,
const FString &  AudioPath,
FResponseChatAnswersDelegate  InDelegate 
)

Chat 답변을 요청합니다 (음성 질문).

POST /chats/answers

음성 파일을 업로드해 답변을 생성합니다.

매개변수
Context[in] 대화 컨텍스트입니다.
AudioPath[in] 음성 파일 경로입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 1392 번째 라인에서 정의되었습니다.

1393{
1395 auto Request = SetupHttpRequest(Url, NETWORK_POST);
1396
1397 // 상대 경로를 절대 경로로 변환
1398 FString AbsoluteAudioPath = FPaths::IsRelative(AudioPath)
1399 ? FPaths::Combine(FPaths::ProjectDir(), AudioPath)
1400 : AudioPath;
1401 AbsoluteAudioPath = FPaths::ConvertRelativePathToFull(AbsoluteAudioPath);
1402
1403 // multipart/form-data로 context와 audio 파일 전송
1405 Form.AddText(TEXT("context"), Context);
1406 Form.AddText(TEXT("level"), FString::FromInt(ULingoGameHelper::GetLingoGameState(GetWorld())->GetRoomLevel()));
1407
1408 if (!Form.AddFile(TEXT("audio"), AbsoluteAudioPath))
1409 {
1410 NETWORK_LOG(TEXT("[POST] RequestChatAnswersWithAudio: audio file load failed: %s"), *AudioPath);
1411 FResponseChatAnswers EmptyResponse;
1412 InDelegate.ExecuteIfBound(EmptyResponse, false);
1413 return;
1414 }
1415
1416 Form.SetupHttpRequest(Request);
1417
1418 LogNetwork(ENetworkLogType::Post, *Request->GetURL(), FString::Printf(TEXT("Context: %s, AudioPath: %s"), *Context, *AudioPath));
1419
1420 Request->OnProcessRequestComplete().BindLambda(
1421 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate](
1422 FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSuccess)
1423 {
1424 if (!WeakThis.IsValid() || IsEngineExitRequested())
1425 return;
1426
1427 WeakThis->AddNetworkWaitCount(-1);
1428 FResponseChatAnswers ResponseData;
1429
1430 if (bSuccess && HttpResponse.IsValid())
1431 {
1432 const int32 ResponseCode = HttpResponse->GetResponseCode();
1433
1434 NETWORK_LOG(TEXT("[RES] RequestChatAnswersWithAudio - Code: %d, Response: %s"),
1435 ResponseCode, *HttpResponse->GetContentAsString());
1436
1437 if (IsResSuccess(ResponseCode))
1438 {
1439 ResponseData.SetFromHttpResponse(HttpResponse);
1440 ResponseData.PrintData();
1441 InDelegate.ExecuteIfBound(ResponseData, true);
1442 }
1443 else
1444 {
1445 WeakThis->ShowNetworkErrorPopup(ResponseCode, HttpResponse->GetContentAsString());
1446 InDelegate.ExecuteIfBound(ResponseData, false);
1447 }
1448 }
1449 else
1450 {
1451 NETWORK_LOG(TEXT("[POST] RequestChatAnswersWithAudio failed - bSuccess: %s, Response valid: %s"),
1452 bSuccess ? TEXT("true") : TEXT("false"),
1453 HttpResponse.IsValid() ? TEXT("true") : TEXT("false"));
1454
1455 int32 ErrorCode = HttpResponse.IsValid() ? HttpResponse->GetResponseCode() : 0;
1456 FString ErrorContent = HttpResponse.IsValid() ? HttpResponse->GetContentAsString() : TEXT("Network connection failed");
1457 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
1458
1459 InDelegate.ExecuteIfBound(ResponseData, false);
1460 }
1461 });
1462
1464 Request->ProcessRequest();
1465}
#define NETWORK_POST
언리얼 엔진에 기본 제공되지 않는 multipart/form-data 빌더의 경량 구현입니다.
void AddText(const FString &FieldName, const FString &Value)
간단한 텍스트 필드를 추가합니다.
void SetupHttpRequest(const TSharedRef< IHttpRequest, ESPMode::ThreadSafe > &Request)
HTTP 요청에 Content-Type 헤더와 본문을 설정합니다.
bool AddFile(const FString &FieldName, const FString &FilePath, const FString &MimeType=TEXT(""))
파일 데이터를 multipart 본문에 추가합니다.
TSharedRef< IHttpRequest, ESPMode::ThreadSafe > SetupHttpRequest(const FString &Url, const FString &Verb)
void AddNetworkWaitCount(int Value)
네트워크 처리 대기 카운트를 갱신하고 UI에 통보합니다.
static void LogNetwork(ENetworkLogType InLogType, const FString &URL, const FString &Body=TEXT(""))
공통 네트워크 로그 메시지를 출력합니다.
static class ALingoGameState * GetLingoGameState(const UObject *WorldContextObject)
static FString GetFullUrl(const FString &Endpoint)
현재 서버 모드에 맞는 HTTP 엔드포인트 URL을 생성합니다.
Definition NetworkData.h:23
static FString chats_answers
Chat 답변 요청 엔드포인트입니다. POST /chats/answers
Chat Answers 응답 구조체입니다.

다음을 참조함 : FHttpMultipartFormData::AddFile(), FHttpMultipartFormData::AddText(), RequestAPI::chats_answers, Context, NetworkConfig::GetFullUrl(), ULingoGameHelper::GetLingoGameState(), LogNetwork(), NETWORK_LOG, NETWORK_POST, Post, SetupHttpRequest(), FHttpMultipartFormData::SetupHttpRequest().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestChatQuestion()

void UKLingoNetworkSystem::RequestChatQuestion ( const FString &  Context,
const FString &  Question,
FResponseChatAnswersDelegate  InDelegate 
)

Chat 답변을 요청합니다 (텍스트 질문).

POST /chats/answers

대화 맥락과 질문을 제출해 답변을 생성합니다.

매개변수
Context[in] 대화 컨텍스트입니다.
Question[in] 사용자 질문입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 1328 번째 라인에서 정의되었습니다.

1329{
1330 TMap<FString, FString> Query;
1331 Query.Add(TEXT("context"), Context);
1332 Query.Add(TEXT("question"), Question);
1333 Query.Add(TEXT("level"), FString::FromInt(ULingoGameHelper::GetLingoGameState(GetWorld())->GetRoomLevel()));
1335 auto Request = SetupHttpRequest(Url, NETWORK_POST);
1336
1337 LogNetwork(ENetworkLogType::Post, *Request->GetURL(), FString::Printf(TEXT("Context: %s, Question: %s"), *Context, *Question));
1338
1339 Request->OnProcessRequestComplete().BindLambda(
1340 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate](
1341 FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSuccess)
1342 {
1343 if (!WeakThis.IsValid() || IsEngineExitRequested())
1344 return;
1345
1346 WeakThis->AddNetworkWaitCount(-1);
1347 FResponseChatAnswers ResponseData;
1348
1349 if (bSuccess && HttpResponse.IsValid())
1350 {
1351 const int32 ResponseCode = HttpResponse->GetResponseCode();
1352
1353 NETWORK_LOG(TEXT("[RES] RequestChatAnswers - Code: %d, Response: %s"),
1354 ResponseCode, *HttpResponse->GetContentAsString());
1355
1356 if (IsResSuccess(ResponseCode))
1357 {
1358 ResponseData.SetFromHttpResponse(HttpResponse);
1359 ResponseData.PrintData();
1360
1361 InDelegate.ExecuteIfBound(ResponseData, true);
1362 }
1363 else
1364 {
1365 WeakThis->ShowNetworkErrorPopup(ResponseCode, HttpResponse->GetContentAsString());
1366 InDelegate.ExecuteIfBound(ResponseData, false);
1367 }
1368 }
1369 else
1370 {
1371 NETWORK_LOG(TEXT("[POST] RequestChatAnswers failed - bSuccess: %s, Response valid: %s"),
1372 bSuccess ? TEXT("true") : TEXT("false"),
1373 HttpResponse.IsValid() ? TEXT("true") : TEXT("false"));
1374
1375 int32 ErrorCode = HttpResponse.IsValid() ? HttpResponse->GetResponseCode() : 0;
1376 FString ErrorContent = HttpResponse.IsValid() ? HttpResponse->GetContentAsString() : TEXT("Network connection failed");
1377 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
1378
1379 InDelegate.ExecuteIfBound(ResponseData, false);
1380 }
1381 });
1382
1384 Request->ProcessRequest();
1385}
static FString GetFullUrlWithQuery(const FString &Endpoint, const TMap< FString, FString > &QueryParams)
Query 파라미터가 포함된 전체 URL을 반환합니다. 파라미터가 없으면 기본 URL만 반환합니다.
Definition NetworkData.h:32

다음을 참조함 : RequestAPI::chats_answers, Context, NetworkConfig::GetFullUrlWithQuery(), ULingoGameHelper::GetLingoGameState(), LogNetwork(), NETWORK_LOG, NETWORK_POST, Post, SetupHttpRequest().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestDailyAudio()

void UKLingoNetworkSystem::RequestDailyAudio ( const FString &  Context,
const FString &  AudioPath,
FResponseChatDailysDelegate  InDelegate 
)

Daily Chat 답변을 요청합니다 (음성 질문).

POST /chats/dailys

데일리 학습용 음성 질문을 업로드해 답변을 생성합니다.

매개변수
Context[in] 대화 컨텍스트입니다.
AudioPath[in] 음성 파일 경로입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 1536 번째 라인에서 정의되었습니다.

1537{
1539 auto Request = SetupHttpRequest(Url, NETWORK_POST);
1540
1541 // 상대 경로를 절대 경로로 변환
1542 FString AbsoluteAudioPath = FPaths::IsRelative(AudioPath)
1543 ? FPaths::Combine(FPaths::ProjectDir(), AudioPath)
1544 : AudioPath;
1545 AbsoluteAudioPath = FPaths::ConvertRelativePathToFull(AbsoluteAudioPath);
1546
1547 // multipart/form-data로 context와 audio 파일 전송
1549 Form.AddText(TEXT("system"), Context);
1550 Form.AddText(TEXT("level"), FString::FromInt(ULingoGameHelper::GetLingoGameState(GetWorld())->GetRoomLevel()));
1551
1552 if (!Form.AddFile(TEXT("audio"), AbsoluteAudioPath))
1553 {
1554 NETWORK_LOG(TEXT("[POST] RequestChatDailysWithAudio: audio file load failed: %s"), *AudioPath);
1555 FResponseChatDailys EmptyResponse;
1556 InDelegate.ExecuteIfBound(EmptyResponse, false);
1557 return;
1558 }
1559
1560 Form.SetupHttpRequest(Request);
1561
1562 LogNetwork(ENetworkLogType::Post, *Request->GetURL(), FString::Printf(TEXT("Context: %s, AudioPath: %s"), *Context, *AudioPath));
1563
1564 Request->OnProcessRequestComplete().BindLambda(
1565 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate](
1566 FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSuccess)
1567 {
1568 if (!WeakThis.IsValid() || IsEngineExitRequested())
1569 return;
1570
1571 WeakThis->AddNetworkWaitCount(-1);
1572 FResponseChatDailys ResponseData;
1573
1574 if (bSuccess && HttpResponse.IsValid())
1575 {
1576 const int32 ResponseCode = HttpResponse->GetResponseCode();
1577
1578 NETWORK_LOG(TEXT("[RES] RequestChatDailysWithAudio - Code: %d, Response: %s"),
1579 ResponseCode, *HttpResponse->GetContentAsString());
1580
1581 if (IsResSuccess(ResponseCode))
1582 {
1583 ResponseData.SetFromHttpResponse(HttpResponse);
1584 ResponseData.PrintData();
1585 InDelegate.ExecuteIfBound(ResponseData, true);
1586 }
1587 else
1588 {
1589 WeakThis->ShowNetworkErrorPopup(ResponseCode, HttpResponse->GetContentAsString());
1590 InDelegate.ExecuteIfBound(ResponseData, false);
1591 }
1592 }
1593 else
1594 {
1595 NETWORK_LOG(TEXT("[POST] RequestChatDailysWithAudio failed - bSuccess: %s, Response valid: %s"),
1596 bSuccess ? TEXT("true") : TEXT("false"),
1597 HttpResponse.IsValid() ? TEXT("true") : TEXT("false"));
1598
1599 int32 ErrorCode = HttpResponse.IsValid() ? HttpResponse->GetResponseCode() : 0;
1600 FString ErrorContent = HttpResponse.IsValid() ? HttpResponse->GetContentAsString() : TEXT("Network connection failed");
1601 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
1602
1603 InDelegate.ExecuteIfBound(ResponseData, false);
1604 }
1605 });
1606
1608 Request->ProcessRequest();
1609}
static FString chats_daily
Chat Dailys 응답 구조체입니다.

다음을 참조함 : FHttpMultipartFormData::AddFile(), FHttpMultipartFormData::AddText(), RequestAPI::chats_daily, Context, NetworkConfig::GetFullUrl(), ULingoGameHelper::GetLingoGameState(), LogNetwork(), NETWORK_LOG, NETWORK_POST, Post, SetupHttpRequest(), FHttpMultipartFormData::SetupHttpRequest().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestDailyQuestion()

void UKLingoNetworkSystem::RequestDailyQuestion ( const FString &  Context,
const FString &  Question,
FResponseChatDailysDelegate  InDelegate 
)

Daily Chat 답변을 요청합니다 (텍스트 질문).

POST /chats/dailys

데일리 학습용 대화 컨텍스트로 답변을 생성합니다.

매개변수
Context[in] 대화 컨텍스트입니다.
Question[in] 사용자 질문입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 1472 번째 라인에서 정의되었습니다.

1473{
1474 TMap<FString, FString> Query;
1475 Query.Add(TEXT("system"), Context);
1476 Query.Add(TEXT("question"), Question);
1477 Query.Add(TEXT("level"), FString::FromInt(ULingoGameHelper::GetLingoGameState(GetWorld())->GetRoomLevel()));
1479 auto Request = SetupHttpRequest(Url, NETWORK_GET);
1480
1481 LogNetwork(ENetworkLogType::Post, *Request->GetURL(), FString::Printf(TEXT("Context: %s, Question: %s"), *Context, *Question));
1482
1483 Request->OnProcessRequestComplete().BindLambda(
1484 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate](
1485 FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSuccess)
1486 {
1487 if (!WeakThis.IsValid() || IsEngineExitRequested())
1488 return;
1489
1490 WeakThis->ShowLoadingCircle(false);
1491 FResponseChatDailys ResponseData;
1492
1493 if (bSuccess && HttpResponse.IsValid())
1494 {
1495 const int32 ResponseCode = HttpResponse->GetResponseCode();
1496
1497 NETWORK_LOG(TEXT("[RES] RequestChatDailys - Code: %d, Response: %s"),
1498 ResponseCode, *HttpResponse->GetContentAsString());
1499
1500 if (IsResSuccess(ResponseCode))
1501 {
1502 ResponseData.SetFromHttpResponse(HttpResponse);
1503 ResponseData.PrintData();
1504
1505 InDelegate.ExecuteIfBound(ResponseData, true);
1506 }
1507 else
1508 {
1509 WeakThis->ShowNetworkErrorPopup(ResponseCode, HttpResponse->GetContentAsString());
1510 InDelegate.ExecuteIfBound(ResponseData, false);
1511 }
1512 }
1513 else
1514 {
1515 NETWORK_LOG(TEXT("[POST] RequestChatDailys failed - bSuccess: %s, Response valid: %s"),
1516 bSuccess ? TEXT("true") : TEXT("false"),
1517 HttpResponse.IsValid() ? TEXT("true") : TEXT("false"));
1518
1519 int32 ErrorCode = HttpResponse.IsValid() ? HttpResponse->GetResponseCode() : 0;
1520 FString ErrorContent = HttpResponse.IsValid() ? HttpResponse->GetContentAsString() : TEXT("Network connection failed");
1521 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
1522
1523 InDelegate.ExecuteIfBound(ResponseData, false);
1524 }
1525 });
1526
1527 ShowLoadingCircle(true);
1528 Request->ProcessRequest();
1529}
#define NETWORK_GET
void ShowLoadingCircle(bool bShow)
LoadingCircle을 표시하거나 숨깁니다.

다음을 참조함 : RequestAPI::chats_daily, Context, NetworkConfig::GetFullUrlWithQuery(), ULingoGameHelper::GetLingoGameState(), LogNetwork(), NETWORK_GET, NETWORK_LOG, Post, SetupHttpRequest().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestEvaluationResult()

void UKLingoNetworkSystem::RequestEvaluationResult ( int32  RoomId,
FResponseEvaluationResultDelegate  InDelegate 
)

Evaluation 결과를 조회합니다.

GET /evaluations/rooms/{room_id}

평가 결과를 UI에 표시하기 위해 서버에서 데이터를 가져옵니다.

매개변수
RoomId[in] 평가 룸 ID입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 1270 번째 라인에서 정의되었습니다.

1271{
1272 // URL 형식: /evaluations/rooms/{room_id}
1273 FString Endpoint = FString::Printf(TEXT("%s/%d"), *RequestAPI::evaluations_rooms, RoomId);
1274 FString Url = NetworkConfig::GetFullUrl(Endpoint);
1275 auto Request = SetupHttpRequest(Url, NETWORK_GET);
1276
1277 LogNetwork(ENetworkLogType::Get, *Request->GetURL());
1278
1279 Request->OnProcessRequestComplete().BindLambda(
1280 [this, InDelegate](FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSuccess)
1281 {
1282 ShowLoadingCircle(false);
1283
1284 FResponseEvaluationResult ResponseData;
1285
1286 if (bSuccess && HttpResponse.IsValid())
1287 {
1288 const int32 ResponseCode = HttpResponse->GetResponseCode();
1289
1290 NETWORK_LOG(TEXT("[RES] RequestEvaluationResult - Code: %d, Response: %s"),
1291 ResponseCode, *HttpResponse->GetContentAsString());
1292
1293 if (IsResSuccess(ResponseCode))
1294 {
1295 ResponseData.SetFromHttpResponse(HttpResponse);
1296 ResponseData.PrintData();
1297 InDelegate.ExecuteIfBound(ResponseData, true);
1298 }
1299 else
1300 {
1301 ShowNetworkErrorPopup(ResponseCode, HttpResponse->GetContentAsString());
1302 InDelegate.ExecuteIfBound(ResponseData, false);
1303 }
1304 }
1305 else
1306 {
1307 NETWORK_LOG(TEXT("[GET] RequestEvaluationResult failed - bSuccess: %s, Response valid: %s"),
1308 bSuccess ? TEXT("true") : TEXT("false"),
1309 HttpResponse.IsValid() ? TEXT("true") : TEXT("false"));
1310
1311 int32 ErrorCode = HttpResponse.IsValid() ? HttpResponse->GetResponseCode() : 0;
1312 FString ErrorContent = HttpResponse.IsValid() ? HttpResponse->GetContentAsString() : TEXT("Network connection failed");
1313 ShowNetworkErrorPopup(ErrorCode, ErrorContent);
1314
1315 InDelegate.ExecuteIfBound(ResponseData, false);
1316 }
1317 });
1318
1319 ShowLoadingCircle(true);
1320 Request->ProcessRequest();
1321}
void ShowNetworkErrorPopup(int32 ResponseCode, const FString &ResponseContent)
네트워크 에러 팝업을 표시합니다.
static bool IsResSuccess(const int InCode)
static FString evaluations_rooms
Evaluation 결과 조회 엔드포인트입니다. GET /evaluations/rooms/{room_id}
Evaluation 결과 응답 구조체입니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.

다음을 참조함 : RequestAPI::evaluations_rooms, Get, NetworkConfig::GetFullUrl(), IsResSuccess(), LogNetwork(), NETWORK_GET, NETWORK_LOG, FResponseEvaluationResult::PrintData(), FResponseEvaluationResult::SetFromHttpResponse(), SetupHttpRequest(), ShowLoadingCircle(), ShowNetworkErrorPopup().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestInterviewAnswer()

void UKLingoNetworkSystem::RequestInterviewAnswer ( const FRequestInterviewAnswer Answer,
FResponseInterviewAnswerDelegate  InDelegate 
)

인터뷰 답변 제출 요청을 전송합니다.

사용자 답변을 서버로 전송하여 평가/저장을 수행합니다.

매개변수
Answer[in] 제출할 인터뷰 답변 데이터입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 768 번째 라인에서 정의되었습니다.

769{
770 // {room_id}?room_id=
771 FString Endpoint = FString::Printf(TEXT("%s/%lld"), *RequestAPI::interview_answer, ULingoGameHelper::GetLingoGameState( GetWorld())->GetRoomId() );
772 FString Url = NetworkConfig::GetFullUrl(Endpoint);
773
774 auto Request = SetupHttpRequest(Url, NETWORK_POST);
775
776 // Request Body 설정
777 FString RequestBody;
778 if (Answer.ToJsonString(RequestBody))
779 {
780 Request->SetContentAsString(RequestBody);
781 NETWORK_LOG(TEXT("[POST] RequestInterviewAnswer Body: %s"), *RequestBody);
782 }
783 else
784 {
785 NETWORK_LOG(TEXT("[POST] RequestInterviewAnswer - Failed to serialize request body"));
786 }
787
788 LogNetwork(ENetworkLogType::Post, *Request->GetURL(), *RequestBody);
789
790 Request->OnProcessRequestComplete().BindLambda(
791 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate](FHttpRequestPtr Req, FHttpResponsePtr ResPtr, bool bWasSuccessful)
792 {
793 if (!WeakThis.IsValid() || IsEngineExitRequested())
794 return;
795
796 WeakThis->AddNetworkWaitCount(-1);
797 FResponseInterviewAnswer ResponseData;
798
799 if (bWasSuccessful && ResPtr.IsValid())
800 {
801 const int32 ResponseCode = ResPtr->GetResponseCode();
802
803 NETWORK_LOG(TEXT("[POST] RequestInterviewAnswer - Code: %d, Response: %s"),
804 ResponseCode, *ResPtr->GetContentAsString());
805
806 if (IsResSuccess(ResponseCode))
807 {
808 ResponseData.SetFromHttpResponse(ResPtr);
809 ResponseData.PrintData();
810 InDelegate.ExecuteIfBound(ResponseData, true);
811 }
812 else
813 {
814 WeakThis->ShowNetworkErrorPopup(ResponseCode, ResPtr->GetContentAsString());
815 InDelegate.ExecuteIfBound(ResponseData, false);
816 }
817 }
818 else
819 {
820 NETWORK_LOG(TEXT("[POST] RequestInterviewAnswer failed - bSuccess: %s, Response valid: %s"),
821 bWasSuccessful ? TEXT("true") : TEXT("false"),
822 ResPtr.IsValid() ? TEXT("true") : TEXT("false"));
823
824 int32 ErrorCode = ResPtr.IsValid() ? ResPtr->GetResponseCode() : 0;
825 FString ErrorContent = ResPtr.IsValid() ? ResPtr->GetContentAsString() : TEXT("Network connection failed");
826 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
827
828 InDelegate.ExecuteIfBound(ResponseData, false);
829 }
830 });
831
833 Request->ProcessRequest();
834}
static FString interview_answer
Definition NetworkData.h:93
bool ToJsonString(FString &OutJson) const
구조체를 JSON 문자열로 변환합니다.

다음을 참조함 : NetworkConfig::GetFullUrl(), ULingoGameHelper::GetLingoGameState(), RequestAPI::interview_answer, LogNetwork(), NETWORK_LOG, NETWORK_POST, Post, SetupHttpRequest(), FRequestInterviewAnswer::ToJsonString().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestInterviewHello()

void UKLingoNetworkSystem::RequestInterviewHello ( FResponseInterviewHelloDelegate  InDelegate)

인터뷰 시작 요청을 전송합니다.

인터뷰 시나리오를 시작하기 위한 진입 요청입니다.

매개변수
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 714 번째 라인에서 정의되었습니다.

715{
717 auto Request = SetupHttpRequest(Url, NETWORK_GET);
718
719 LogNetwork(ENetworkLogType::Get, *Request->GetURL());
720
721 Request->OnProcessRequestComplete().BindLambda(
722 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate](FHttpRequestPtr Req, FHttpResponsePtr ResPtr, bool bWasSuccessful)
723 {
724 if (!WeakThis.IsValid() || IsEngineExitRequested())
725 return;
726
727 WeakThis->AddNetworkWaitCount(-1);
728 FResponseInterviewHello ResponseData;
729
730 if (bWasSuccessful && ResPtr.IsValid())
731 {
732 const int32 ResponseCode = ResPtr->GetResponseCode();
733
734 NETWORK_LOG(TEXT("[RES] RequestInterviewHello - Code: %d, Response: %s"), ResponseCode, *ResPtr->GetContentAsString());
735
736 if (IsResSuccess(ResponseCode))
737 {
738 ResponseData.SetFromHttpResponse(ResPtr);
739 ResponseData.PrintData();
740 InDelegate.ExecuteIfBound(ResponseData, true);
741 }
742 else
743 {
744 WeakThis->ShowNetworkErrorPopup(ResponseCode, ResPtr->GetContentAsString());
745 InDelegate.ExecuteIfBound(ResponseData, false);
746 }
747 }
748 else
749 {
750 NETWORK_LOG(TEXT("[POST] RequestInterviewHello failed - bSuccess: %s, Response valid: %s"),
751 bWasSuccessful ? TEXT("true") : TEXT("false"),
752 ResPtr.IsValid() ? TEXT("true") : TEXT("false"));
753
754 int32 ErrorCode = ResPtr.IsValid() ? ResPtr->GetResponseCode() : 0;
755 FString ErrorContent = ResPtr.IsValid() ? ResPtr->GetContentAsString() : TEXT("Network connection failed");
756 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
757
758 InDelegate.ExecuteIfBound(ResponseData, false);
759 }
760 });
761
763 Request->ProcessRequest();
764}
static FString interview_hello
Definition NetworkData.h:92

다음을 참조함 : Get, NetworkConfig::GetFullUrl(), RequestAPI::interview_hello, LogNetwork(), NETWORK_GET, NETWORK_LOG, SetupHttpRequest().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestListenAudio()

void UKLingoNetworkSystem::RequestListenAudio ( const FString &  AudioText,
FResponseListenAudioDelegate  InDelegate 
)

Listen 음성 생성 요청을 전송합니다.

텍스트를 음성으로 변환해 듣기 학습에 사용하는 요청입니다.

매개변수
AudioText[in] 음성으로 변환할 텍스트입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 535 번째 라인에서 정의되었습니다.

536{
537 if (auto ACM = UVoiceCacheManager::Get(GetWorld()))
538 {
539 // HACK, 임시로 서버로 보내지 않게 하기 위해서
540 // 일레븐랩스를 사용해서 하는데, 500이슈가 뜬다
541 // 일레븐 랩스의 토큰을 모두 소진해서,
542 // 그러면 이것을 당분간 해결하기전까지는 발생안하기 위해서 데이터를 스킵한다.
543 TArray<uint8> CachedAudio;
544 if (ACM->TryGetCachedAudio(AudioText, CachedAudio))
545 {
546 FResponseListenAudio Response;
547 Response.audio_text = AudioText;
548 Response.audio_base64 = CachedAudio;
549
550 // ✅ 비동기 Delegate 호출 (타이밍 문제 해결)
551 if (UWorld* World = GetWorld())
552 {
553 // Response를 힙에 할당하여 Lambda에서 안전하게 사용
554 TSharedPtr<FResponseListenAudio> SharedResponse = MakeShared<FResponseListenAudio>(Response);
555
556 World->GetTimerManager().SetTimerForNextTick([InDelegate, SharedResponse]()
557 {
558 // 다음 프레임에 Delegate 호출
559 InDelegate.ExecuteIfBound(*SharedResponse, true);
560 });
561 }
562 else
563 {
564 // World가 없으면 즉시 호출 (fallback)
565 InDelegate.ExecuteIfBound(Response, true);
566 }
567
568 return;
569 }
570 }
571
572 TMap<FString, FString> Query;
573 Query.Add(TEXT("audio_text"), AudioText);
575 auto Request = SetupHttpRequest(Url, NETWORK_POST);
576 LogNetwork(ENetworkLogType::Post, *Request->GetURL());
577
578 Request->OnProcessRequestComplete().BindLambda(
579 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate, AudioText](FHttpRequestPtr Req, FHttpResponsePtr ResPtr, bool bWasSuccessful)
580 {
581 if (!WeakThis.IsValid() || IsEngineExitRequested())
582 return;
583
584 WeakThis->AddNetworkWaitCount(-1);
585 FResponseListenAudio ResponseData;
586
587 if (bWasSuccessful && ResPtr.IsValid())
588 {
589 const int32 ResponseCode = ResPtr->GetResponseCode();
590
591 NETWORK_LOG(TEXT("[RES] RequestListenAudio - Code: %d"), ResponseCode);
592
593 if (IsResSuccess(ResponseCode))
594 {
595 ResponseData.SetFromHttpResponse(ResPtr);
596 ResponseData.PrintData();
597
598 // [4] 캐시에 저장 (Lambda 캡처된 AudioText 사용)
599 if (auto ACM = UVoiceCacheManager::Get(WeakThis->GetWorld()))
600 {
601 if (ResponseData.audio_base64.Num() > 0)
602 {
603 ACM->SaveToCache(AudioText, ResponseData.audio_base64);
604 }
605 }
606
607 InDelegate.ExecuteIfBound(ResponseData, true);
608 }
609 else
610 {
611 WeakThis->ShowNetworkErrorPopup(ResponseCode, ResPtr->GetContentAsString());
612 InDelegate.ExecuteIfBound(ResponseData, false);
613 }
614 }
615 else
616 {
617 NETWORK_LOG(TEXT("[POST] RequestListenAudio failed - bSuccess: %s, Response valid: %s"),
618 bWasSuccessful ? TEXT("true") : TEXT("false"),
619 ResPtr.IsValid() ? TEXT("true") : TEXT("false"));
620
621 int32 ErrorCode = ResPtr.IsValid() ? ResPtr->GetResponseCode() : 0;
622 FString ErrorContent = ResPtr.IsValid() ? ResPtr->GetContentAsString() : TEXT("Network connection failed");
623 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
624
625 InDelegate.ExecuteIfBound(ResponseData, false);
626 }
627 });
628
630 Request->ProcessRequest();
631}
static FString listenings_audio
Definition NetworkData.h:89
TArray< uint8 > audio_base64

다음을 참조함 : FResponseListenAudio::audio_base64, FResponseListenAudio::audio_text, NetworkConfig::GetFullUrlWithQuery(), RequestAPI::listenings_audio, LogNetwork(), NETWORK_LOG, NETWORK_POST, Post, SetupHttpRequest().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestListenResult()

void UKLingoNetworkSystem::RequestListenResult ( const FRequestListenResult Result,
FResponseListenResultDelegate  InDelegate 
)

Listen 결과 제출 요청을 전송합니다.

듣기 학습 결과를 서버에 기록하기 위해 호출합니다.

매개변수
Result[in] 제출할 결과 데이터입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 1089 번째 라인에서 정의되었습니다.

1090{
1092 auto Request = SetupHttpRequest(Url, NETWORK_POST);
1093
1094 // Request Body 설정
1095 FString RequestBody;
1096 if (Result.ToJsonString(RequestBody))
1097 Request->SetContentAsString(RequestBody);
1098
1099 LogNetwork(ENetworkLogType::Post, *Request->GetURL(), *RequestBody);
1100
1101 Request->OnProcessRequestComplete().BindLambda(
1102 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate](FHttpRequestPtr Req, FHttpResponsePtr ResPtr, bool bWasSuccessful)
1103 {
1104 if (!WeakThis.IsValid() || IsEngineExitRequested())
1105 return;
1106
1107 WeakThis->ShowLoadingCircle(false);
1108
1109 FResponseListenResult ResponseData;
1110
1111 if (bWasSuccessful && ResPtr.IsValid())
1112 {
1113 const int32 ResponseCode = ResPtr->GetResponseCode();
1114
1115 NETWORK_LOG(TEXT("[RES] RequestListenResult - Code: %d, Response: %s"),
1116 ResponseCode, *ResPtr->GetContentAsString());
1117
1118 if (IsResSuccess(ResponseCode))
1119 {
1120 ResponseData.SetFromHttpResponse(ResPtr);
1121 ResponseData.PrintData();
1122 InDelegate.ExecuteIfBound(ResponseData, true);
1123 }
1124 else
1125 {
1126 WeakThis->ShowNetworkErrorPopup(ResponseCode, ResPtr->GetContentAsString());
1127 InDelegate.ExecuteIfBound(ResponseData, false);
1128 }
1129 }
1130 else
1131 {
1132 NETWORK_LOG(TEXT("[RES] RequestListenResult failed - bSuccess: %s, Response valid: %s"),
1133 bWasSuccessful ? TEXT("true") : TEXT("false"),
1134 ResPtr.IsValid() ? TEXT("true") : TEXT("false"));
1135
1136 int32 ErrorCode = ResPtr.IsValid() ? ResPtr->GetResponseCode() : 0;
1137 FString ErrorContent = ResPtr.IsValid() ? ResPtr->GetContentAsString() : TEXT("Network connection failed");
1138 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
1139
1140 InDelegate.ExecuteIfBound(ResponseData, false);
1141 }
1142 });
1143
1144 ShowLoadingCircle(true);
1145 Request->ProcessRequest();
1146}
static FString listen_result
Definition NetworkData.h:99
bool ToJsonString(FString &OutJson) const
구조체를 JSON 문자열로 변환합니다.

다음을 참조함 : NetworkConfig::GetFullUrl(), RequestAPI::listen_result, LogNetwork(), NETWORK_LOG, NETWORK_POST, Post, SetupHttpRequest(), FRequestListenResult::ToJsonString().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestListenScenario()

void UKLingoNetworkSystem::RequestListenScenario ( FResponseListenScenarioDelegate  InDelegate)

Listen 시나리오 조회 요청을 전송합니다.

듣기 학습 단계의 시나리오 데이터를 받아오기 위한 호출입니다.

매개변수
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 1032 번째 라인에서 정의되었습니다.

1033{
1034 // URL 형식: /scenario/stages/redis/{room_id}/{scenario_id}/{stage_type}/{level}
1035 FString Endpoint = FString::Printf(TEXT("%s/%lld/%d/%d/%d"), *RequestAPI::scenario,
1036 ULingoGameHelper::GetLingoGameState( GetWorld())->GetRoomId(),
1037 1,
1039 ULingoGameHelper::GetLingoGameState( GetWorld())->GetRoomLevel());
1040
1041 FString Url = NetworkConfig::GetFullUrl(Endpoint);
1042 auto Request = SetupHttpRequest(Url, NETWORK_GET);
1043
1044 LogNetwork(ENetworkLogType::Get, *Request->GetURL());
1045
1046 Request->OnProcessRequestComplete().BindLambda(
1047 [this, InDelegate](FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSuccess)
1048 {
1050
1051 FResponseListenScenario ResponseData;
1052
1053 if (bSuccess && HttpResponse.IsValid())
1054 {
1055 const int32 ResponseCode = HttpResponse->GetResponseCode();
1056
1057 NETWORK_LOG(TEXT("[RES] Code: %d, Response: %s"), ResponseCode, *HttpResponse->GetContentAsString());
1058
1059 if (IsResSuccess(ResponseCode))
1060 {
1061 ResponseData.SetFromHttpResponse(HttpResponse);
1062 // ResponseData.PrintData();
1063 InDelegate.ExecuteIfBound(ResponseData, true);
1064 }
1065 else
1066 {
1067 ShowNetworkErrorPopup(ResponseCode, HttpResponse->GetContentAsString());
1068 InDelegate.ExecuteIfBound(ResponseData, false);
1069 }
1070 }
1071 else
1072 {
1073 NETWORK_LOG(TEXT("[RES] RequestReadScenario failed - bSuccess: %s, Response valid: %s"),
1074 bSuccess ? TEXT("true") : TEXT("false"),
1075 HttpResponse.IsValid() ? TEXT("true") : TEXT("false"));
1076
1077 int32 ErrorCode = HttpResponse.IsValid() ? HttpResponse->GetResponseCode() : 0;
1078 FString ErrorContent = HttpResponse.IsValid() ? HttpResponse->GetContentAsString() : TEXT("Network connection failed");
1079 ShowNetworkErrorPopup(ErrorCode, ErrorContent);
1080
1081 InDelegate.ExecuteIfBound(ResponseData, false);
1082 }
1083 });
1084
1086 Request->ProcessRequest();
1087}
static int32 GetStageTypeIndex(const EQuestType QuestType)
static FString scenario
Scenario 조회 엔드포인트입니다.
Definition NetworkData.h:96
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.

다음을 참조함 : AddNetworkWaitCount(), Get, NetworkConfig::GetFullUrl(), ULingoGameHelper::GetLingoGameState(), ULingoGameHelper::GetStageTypeIndex(), IsResSuccess(), Listen, LogNetwork(), NETWORK_GET, NETWORK_LOG, RequestAPI::scenario, FResponseListenScenario::SetFromHttpResponse(), SetupHttpRequest(), ShowNetworkErrorPopup().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestReadResult()

void UKLingoNetworkSystem::RequestReadResult ( const FRequestReadResult Result,
FResponseReadResultDelegate  InDelegate 
)

Read 결과 제출 요청을 전송합니다.

읽기 학습 결과를 서버에 기록하기 위해 호출합니다.

매개변수
Result[in] 제출할 결과 데이터입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 971 번째 라인에서 정의되었습니다.

972{
974 auto Request = SetupHttpRequest(Url, NETWORK_POST);
975
976 // Request Body 설정
977 FString RequestBody;
978 if (Result.ToJsonString(RequestBody))
979 Request->SetContentAsString(RequestBody);
980
981 LogNetwork(ENetworkLogType::Post, *Request->GetURL(), *RequestBody);
982
983 Request->OnProcessRequestComplete().BindLambda(
984 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate](FHttpRequestPtr Req, FHttpResponsePtr ResPtr, bool bWasSuccessful)
985 {
986 if (!WeakThis.IsValid() || IsEngineExitRequested())
987 return;
988
989 WeakThis->ShowLoadingCircle(false);
990
991 FResponseReadResult ResponseData;
992
993 if (bWasSuccessful && ResPtr.IsValid())
994 {
995 const int32 ResponseCode = ResPtr->GetResponseCode();
996
997 NETWORK_LOG(TEXT("[POST] RequestQuestResult - Code: %d, Response: %s"),
998 ResponseCode, *ResPtr->GetContentAsString());
999
1000 if (IsResSuccess(ResponseCode))
1001 {
1002 ResponseData.SetFromHttpResponse(ResPtr);
1003 ResponseData.PrintData();
1004 InDelegate.ExecuteIfBound(ResponseData, true);
1005 }
1006 else
1007 {
1008 WeakThis->ShowNetworkErrorPopup(ResponseCode, ResPtr->GetContentAsString());
1009 InDelegate.ExecuteIfBound(ResponseData, false);
1010 }
1011 }
1012 else
1013 {
1014 NETWORK_LOG(TEXT("[POST] RequestReadResult failed - bSuccess: %s, Response valid: %s"),
1015 bWasSuccessful ? TEXT("true") : TEXT("false"),
1016 ResPtr.IsValid() ? TEXT("true") : TEXT("false"));
1017
1018 int32 ErrorCode = ResPtr.IsValid() ? ResPtr->GetResponseCode() : 0;
1019 FString ErrorContent = ResPtr.IsValid() ? ResPtr->GetContentAsString() : TEXT("Network connection failed");
1020 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
1021
1022 InDelegate.ExecuteIfBound(ResponseData, false);
1023 }
1024 });
1025
1026 ShowLoadingCircle(true);
1027 Request->ProcessRequest();
1028}
static FString read_result
Definition NetworkData.h:98
bool ToJsonString(FString &OutJson) const
구조체를 JSON 문자열로 변환합니다.

다음을 참조함 : NetworkConfig::GetFullUrl(), LogNetwork(), NETWORK_LOG, NETWORK_POST, Post, RequestAPI::read_result, SetupHttpRequest(), FRequestReadResult::ToJsonString().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestReadScenario()

void UKLingoNetworkSystem::RequestReadScenario ( FResponseReadScenarioDelegate  InDelegate)

Read 시나리오 조회 요청을 전송합니다.

읽기 학습 단계의 시나리오 데이터를 받아오기 위한 호출입니다.

매개변수
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 913 번째 라인에서 정의되었습니다.

914{
915 // URL 형식: /scenario/stages/redis/{room_id}/{scenario_id}/{stage_type}/{level}
916 FString Endpoint = FString::Printf(TEXT("%s/%lld/%d/%d/%d"), *RequestAPI::scenario,
917 ULingoGameHelper::GetLingoGameState( GetWorld())->GetRoomId(),
918 1,
920 ULingoGameHelper::GetLingoGameState( GetWorld())->GetRoomLevel());
921
922 FString Url = NetworkConfig::GetFullUrl(Endpoint);
923 auto Request = SetupHttpRequest(Url, NETWORK_GET);
924
925 LogNetwork(ENetworkLogType::Get, *Request->GetURL());
926
927 Request->OnProcessRequestComplete().BindLambda(
928 [this, InDelegate](FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSuccess)
929 {
931
932 FResponseReadScenario ResponseData;
933
934 if (bSuccess && HttpResponse.IsValid())
935 {
936 const int32 ResponseCode = HttpResponse->GetResponseCode();
937
938 NETWORK_LOG(TEXT("[RES] Code: %d, Response: %s"), ResponseCode, *HttpResponse->GetContentAsString());
939
940 if (IsResSuccess(ResponseCode))
941 {
942 ResponseData.SetFromHttpResponse(HttpResponse);
943 // ResponseData.PrintData();
944 InDelegate.ExecuteIfBound(ResponseData, true);
945 }
946 else
947 {
948 ShowNetworkErrorPopup(ResponseCode, HttpResponse->GetContentAsString());
949 InDelegate.ExecuteIfBound(ResponseData, false);
950 }
951 }
952 else
953 {
954 NETWORK_LOG(TEXT("[GET] RequestReadScenario failed - bSuccess: %s, Response valid: %s"),
955 bSuccess ? TEXT("true") : TEXT("false"),
956 HttpResponse.IsValid() ? TEXT("true") : TEXT("false"));
957
958 int32 ErrorCode = HttpResponse.IsValid() ? HttpResponse->GetResponseCode() : 0;
959 FString ErrorContent = HttpResponse.IsValid() ? HttpResponse->GetContentAsString() : TEXT("Network connection failed");
960 ShowNetworkErrorPopup(ErrorCode, ErrorContent);
961
962 InDelegate.ExecuteIfBound(ResponseData, false);
963 }
964 });
965
967 Request->ProcessRequest();
968}
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.

다음을 참조함 : AddNetworkWaitCount(), Get, NetworkConfig::GetFullUrl(), ULingoGameHelper::GetLingoGameState(), ULingoGameHelper::GetStageTypeIndex(), IsResSuccess(), LogNetwork(), NETWORK_GET, NETWORK_LOG, Read, RequestAPI::scenario, FResponseReadScenario::SetFromHttpResponse(), SetupHttpRequest(), ShowNetworkErrorPopup().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestSpeakingJudges()

void UKLingoNetworkSystem::RequestSpeakingJudges ( const FString &  Question,
const FString &  AudioPath,
FResponseSpeakingJudesDelegate  InDelegate 
)

Speaking 평가 요청을 전송합니다.

질문 텍스트와 사용자의 음성 파일을 제출해 발음 평가를 요청합니다.

매개변수
Question[in] 평가 기준 질문 텍스트입니다.
AudioPath[in] 업로드할 음성 파일 경로입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 633 번째 라인에서 정의되었습니다.

637{
638 TMap<FString, FString> Query;
639 Query.Add(TEXT("question"), Question);
641 auto Request = SetupHttpRequest(Url, NETWORK_POST);
642
643 // 상대 경로를 절대 경로로 변환
644 FString AbsoluteAudioPath = FPaths::IsRelative(AudioPath)
645 ? FPaths::Combine(FPaths::ProjectDir(), AudioPath)
646 : AudioPath;
647 AbsoluteAudioPath = FPaths::ConvertRelativePathToFull(AbsoluteAudioPath);
648
650 if (!Form.AddFile(TEXT("audio"), AbsoluteAudioPath))
651 {
652 NETWORK_LOG(TEXT("[POST] Speaking Questions: file load failed: %s"), *AudioPath);
653 FResponseSpeakingJudes EmptyResponse;
654 InDelegate.ExecuteIfBound(EmptyResponse, false);
655 return;
656 }
657 Form.SetupHttpRequest(Request);
658
659 LogNetwork(ENetworkLogType::Post, *Request->GetURL());
660
661 Request->OnProcessRequestComplete().BindLambda(
662 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate](FHttpRequestPtr Req, FHttpResponsePtr ResPtr, bool bWasSuccessful)
663 {
664 if (!WeakThis.IsValid() || IsEngineExitRequested())
665 return;
666
667 WeakThis->ShowLoadingCircle(false);
668 FResponseSpeakingJudes ResponseData;
669
670 if (bWasSuccessful && ResPtr.IsValid())
671 {
672 const int32 ResponseCode = ResPtr->GetResponseCode();
673
674 NETWORK_LOG(TEXT("[RES] RequestSpeakingQuestions - Code: %d, Response: %s"), ResponseCode, *ResPtr->GetContentAsString());
675
676 if (IsResSuccess(ResponseCode))
677 {
678 ResponseData.SetFromHttpResponse(ResPtr);
679 ResponseData.PrintData();
680 InDelegate.ExecuteIfBound(ResponseData, true);
681 }
682 else
683 {
684 WeakThis->ShowNetworkErrorPopup(ResponseCode, ResPtr->GetContentAsString());
685 InDelegate.ExecuteIfBound(ResponseData, false);
686 }
687 }
688 else
689 {
690 NETWORK_LOG(TEXT("[POST] RequestSpeakingQuestions failed - bSuccess: %s, Response valid: %s"),
691 bWasSuccessful ? TEXT("true") : TEXT("false"),
692 ResPtr.IsValid() ? TEXT("true") : TEXT("false"));
693
694 int32 ErrorCode = ResPtr.IsValid() ? ResPtr->GetResponseCode() : 0;
695 FString ErrorContent = ResPtr.IsValid() ? ResPtr->GetContentAsString() : TEXT("Network connection failed");
696 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
697
698 InDelegate.ExecuteIfBound(ResponseData, false);
699 }
700 });
701
702 ShowLoadingCircle(true);
703 Request->ProcessRequest();
704}
static FString speakings_judes
Definition NetworkData.h:90
Speaking Questions 응답 구조체입니다.

다음을 참조함 : FHttpMultipartFormData::AddFile(), NetworkConfig::GetFullUrlWithQuery(), LogNetwork(), NETWORK_LOG, NETWORK_POST, Post, SetupHttpRequest(), FHttpMultipartFormData::SetupHttpRequest(), RequestAPI::speakings_judes.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestSpeakResult()

void UKLingoNetworkSystem::RequestSpeakResult ( const FRequestSpeakResult Result,
FResponseSpeakResultDelegate  InDelegate 
)

Speak 결과 제출 요청을 전송합니다.

말하기 학습 결과를 서버에 기록하기 위해 호출합니다.

매개변수
Result[in] 제출할 결과 데이터입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 1207 번째 라인에서 정의되었습니다.

1208{
1210 auto Request = SetupHttpRequest(Url, NETWORK_POST);
1211
1212 // Request Body 설정
1213 FString RequestBody;
1214 if (Result.ToJsonString(RequestBody))
1215 Request->SetContentAsString(RequestBody);
1216
1217 LogNetwork(ENetworkLogType::Post, *Request->GetURL(), *RequestBody);
1218
1219 Request->OnProcessRequestComplete().BindLambda(
1220 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate](FHttpRequestPtr Req, FHttpResponsePtr ResPtr, bool bWasSuccessful)
1221 {
1222 if (!WeakThis.IsValid() || IsEngineExitRequested())
1223 return;
1224
1225 WeakThis->ShowLoadingCircle(false);
1226
1227 FResponseSpeakResult ResponseData;
1228
1229 if (bWasSuccessful && ResPtr.IsValid())
1230 {
1231 const int32 ResponseCode = ResPtr->GetResponseCode();
1232
1233 NETWORK_LOG(TEXT("[RES] FResponseSpeakResult - Code: %d, Response: %s"),
1234 ResponseCode, *ResPtr->GetContentAsString());
1235
1236 if (IsResSuccess(ResponseCode))
1237 {
1238 ResponseData.SetFromHttpResponse(ResPtr);
1239 ResponseData.PrintData();
1240 InDelegate.ExecuteIfBound(ResponseData, true);
1241 }
1242 else
1243 {
1244 WeakThis->ShowNetworkErrorPopup(ResponseCode, ResPtr->GetContentAsString());
1245 InDelegate.ExecuteIfBound(ResponseData, false);
1246 }
1247 }
1248 else
1249 {
1250 NETWORK_LOG(TEXT("[RES] FResponseSpeakResult failed - bSuccess: %s, Response valid: %s"),
1251 bWasSuccessful ? TEXT("true") : TEXT("false"),
1252 ResPtr.IsValid() ? TEXT("true") : TEXT("false"));
1253
1254 int32 ErrorCode = ResPtr.IsValid() ? ResPtr->GetResponseCode() : 0;
1255 FString ErrorContent = ResPtr.IsValid() ? ResPtr->GetContentAsString() : TEXT("Network connection failed");
1256 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
1257
1258 InDelegate.ExecuteIfBound(ResponseData, false);
1259 }
1260 });
1261
1262 ShowLoadingCircle(true);
1263 Request->ProcessRequest();
1264}
static FString speak_result
bool ToJsonString(FString &OutJson) const
구조체를 JSON 문자열로 변환합니다.

다음을 참조함 : NetworkConfig::GetFullUrl(), LogNetwork(), NETWORK_LOG, NETWORK_POST, Post, SetupHttpRequest(), RequestAPI::speak_result, FRequestSpeakResult::ToJsonString().

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestSpeakScenario()

void UKLingoNetworkSystem::RequestSpeakScenario ( FResponseSpeakScenarioDelegate  InDelegate)

Speak 시나리오 조회 요청을 전송합니다.

말하기 학습 단계의 시나리오 데이터를 받아오기 위한 호출입니다.

매개변수
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 1148 번째 라인에서 정의되었습니다.

1149{
1150 // URL 형식: /scenario/stages/redis/{room_id}/{scenario_id}/{stage_type}/{level}
1151 FString Endpoint = FString::Printf(TEXT("%s/%lld/%d/%d/%d"), *RequestAPI::scenario,
1152 ULingoGameHelper::GetLingoGameState( GetWorld())->GetRoomId(),
1153 1,
1155 ULingoGameHelper::GetLingoGameState( GetWorld())->GetRoomLevel());
1156
1157 FString Url = NetworkConfig::GetFullUrl(Endpoint);
1158 auto Request = SetupHttpRequest(Url, NETWORK_GET);
1159
1160 LogNetwork(ENetworkLogType::Get, *Request->GetURL());
1161
1162 Request->OnProcessRequestComplete().BindLambda(
1163 [this, InDelegate](FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSuccess)
1164 {
1166
1167 FResponseSpeakScenario ResponseData;
1168
1169 if (bSuccess && HttpResponse.IsValid())
1170 {
1171 const int32 ResponseCode = HttpResponse->GetResponseCode();
1172
1173 // NOTE : 굉장히 시끄러움.
1174 // NETWORK_LOG(TEXT("[RES] Code: %d, Response: %s"), ResponseCode, *HttpResponse->GetContentAsString());
1175
1176 if (IsResSuccess(ResponseCode))
1177 {
1178 ResponseData.SetFromHttpResponse(HttpResponse);
1179 ResponseData.PrintData();
1180 InDelegate.ExecuteIfBound(ResponseData, true);
1181 }
1182 else
1183 {
1184 ShowNetworkErrorPopup(ResponseCode, HttpResponse->GetContentAsString());
1185 InDelegate.ExecuteIfBound(ResponseData, false);
1186 }
1187 }
1188 else
1189 {
1190 NETWORK_LOG(TEXT("[RES] RequestSpeakScenario failed - bSuccess: %s, Response valid: %s"),
1191 bSuccess ? TEXT("true") : TEXT("false"),
1192 HttpResponse.IsValid() ? TEXT("true") : TEXT("false"));
1193
1194 int32 ErrorCode = HttpResponse.IsValid() ? HttpResponse->GetResponseCode() : 0;
1195 FString ErrorContent = HttpResponse.IsValid() ? HttpResponse->GetContentAsString() : TEXT("Network connection failed");
1196 ShowNetworkErrorPopup(ErrorCode, ErrorContent);
1197
1198 InDelegate.ExecuteIfBound(ResponseData, false);
1199 }
1200 });
1201
1203 Request->ProcessRequest();
1204}
Speak 시나리오 응답 구조체입니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 구조체를 채웁니다.

다음을 참조함 : AddNetworkWaitCount(), Get, NetworkConfig::GetFullUrl(), ULingoGameHelper::GetLingoGameState(), ULingoGameHelper::GetStageTypeIndex(), IsResSuccess(), LogNetwork(), NETWORK_GET, NETWORK_LOG, FResponseSpeakScenario::PrintData(), RequestAPI::scenario, FResponseSpeakScenario::SetFromHttpResponse(), SetupHttpRequest(), ShowNetworkErrorPopup(), Speak.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestUserMe()

void UKLingoNetworkSystem::RequestUserMe ( FResponseUserMeDelegate  InDelegate)

현재 사용자 정보를 조회합니다.

토큰 기반 인증이 유효한지 검증하는 데 사용됩니다.

매개변수
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 291 번째 라인에서 정의되었습니다.

292{
294 auto Request = SetupHttpRequest( Url, NETWORK_GET );
295
296 LogNetwork(ENetworkLogType::Get, *Request->GetURL());
297
298 Request->OnProcessRequestComplete().BindLambda(
299 [this, InDelegate](FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSuccess)
300 {
302
303 FResponseUserMe ResponseData;
304
305 if (bSuccess && HttpResponse.IsValid())
306 {
307 const int32 ResponseCode = HttpResponse->GetResponseCode();
308
309 NETWORK_LOG(TEXT("[RES] Code: %d, Response: %s"), ResponseCode, *HttpResponse->GetContentAsString());
310
311 if (IsResSuccess(ResponseCode))
312 {
313 ResponseData.SetFromHttpResponse(HttpResponse);
314 ResponseData.PrintData();
315
316 ULingoGameInstanceSubsystem::Get(GetWorld())->SetUserInfo(ResponseData);
317
318 InDelegate.ExecuteIfBound(ResponseData, true);
319 }
320 else
321 {
322 ShowNetworkErrorPopup(ResponseCode, HttpResponse->GetContentAsString());
323 InDelegate.ExecuteIfBound(ResponseData, false);
324 }
325 }
326 else
327 {
328 NETWORK_LOG(TEXT("[GET] RequestUserMe failed - bSuccess: %s, Response valid: %s"),
329 bSuccess ? TEXT("true") : TEXT("false"),
330 HttpResponse.IsValid() ? TEXT("true") : TEXT("false"));
331
332 int32 ErrorCode = HttpResponse.IsValid() ? HttpResponse->GetResponseCode() : 0;
333 FString ErrorContent = HttpResponse.IsValid() ? HttpResponse->GetContentAsString() : TEXT("Network connection failed");
334 ShowNetworkErrorPopup(ErrorCode, ErrorContent);
335
336 InDelegate.ExecuteIfBound(ResponseData, false);
337 }
338 });
339
341 Request->ProcessRequest();
342}
static FString users_me
Definition NetworkData.h:84
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 상태 정보를 갱신합니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.

다음을 참조함 : AddNetworkWaitCount(), Get, NetworkConfig::GetFullUrl(), IsResSuccess(), LogNetwork(), NETWORK_GET, NETWORK_LOG, FResponseUserMe::PrintData(), FResponseUserMe::SetFromHttpResponse(), SetupHttpRequest(), ShowNetworkErrorPopup(), RequestAPI::users_me.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestUserRegister()

void UKLingoNetworkSystem::RequestUserRegister ( const FString &  UserName,
FResponseUserRegisterDelegate  InDelegate 
)

사용자 등록 요청을 전송합니다.

신규 사용자 생성 플로우에서 계정을 생성하기 위해 사용됩니다.

매개변수
UserName[in] 등록할 사용자 이름입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 162 번째 라인에서 정의되었습니다.

163{
165 auto Request = SetupHttpRequest( Url, NETWORK_POST );
166
167 TSharedPtr<FJsonObject> JsonObject = MakeShareable(new FJsonObject);
168 JsonObject->SetStringField(TEXT("username"), UserName);
169 JsonObject->SetStringField(TEXT("fullname"), UserName + TEXT("@klingo.com"));
170 JsonObject->SetStringField(TEXT("password"), UserName);
171
172 FString RequestBody;
173 TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&RequestBody);
174 FJsonSerializer::Serialize(JsonObject.ToSharedRef(), Writer);
175 Request->SetContentAsString(RequestBody);
176
177 LogNetwork(ENetworkLogType::Post, *Request->GetURL(), *RequestBody);
178
179 Request->OnProcessRequestComplete().BindLambda(
180 [this, InDelegate](FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSuccess)
181 {
183
184 FResponseUserRegister ResponseData;
185
186 if (bSuccess && HttpResponse.IsValid())
187 {
188 const int32 ResponseCode = HttpResponse->GetResponseCode();
189
190 if (IsResSuccess(ResponseCode))
191 {
192 ResponseData.SetFromHttpResponse(HttpResponse);
193 ResponseData.PrintData();
194 InDelegate.ExecuteIfBound(ResponseData, true);
195 }
196 else
197 {
198 NETWORK_LOG(TEXT("[POST] RequestUserRegister failed - Code: %d, Response: %s"),
199 ResponseCode, *HttpResponse->GetContentAsString());
200 ShowNetworkErrorPopup(ResponseCode, HttpResponse->GetContentAsString());
201 InDelegate.ExecuteIfBound(ResponseData, false);
202 }
203 }
204 else
205 {
206 NETWORK_LOG(TEXT("[POST] RequestUserRegister failed - bSuccess: %s, Response valid: %s"),
207 bSuccess ? TEXT("true") : TEXT("false"),
208 HttpResponse.IsValid() ? TEXT("true") : TEXT("false"));
209
210 // HTTP 요청 실패 시 팝업 표시
211 int32 ErrorCode = HttpResponse.IsValid() ? HttpResponse->GetResponseCode() : 0;
212 FString ErrorContent = HttpResponse.IsValid() ? HttpResponse->GetContentAsString() : TEXT("Network connection failed");
213 ShowNetworkErrorPopup(ErrorCode, ErrorContent);
214
215 InDelegate.ExecuteIfBound(ResponseData, false);
216 }
217 });
218
220 Request->ProcessRequest();
221}
static FString users_register
Definition NetworkData.h:82
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 상태 정보를 갱신합니다.
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.

다음을 참조함 : AddNetworkWaitCount(), NetworkConfig::GetFullUrl(), IsResSuccess(), LogNetwork(), NETWORK_LOG, NETWORK_POST, Post, FResponseUserRegister::PrintData(), FResponseUserRegister::SetFromHttpResponse(), SetupHttpRequest(), ShowNetworkErrorPopup(), RequestAPI::users_register.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestUserToken()

void UKLingoNetworkSystem::RequestUserToken ( const FString &  UserName,
FResponseUserTokenDelegate  InDelegate 
)

사용자 토큰 발급 요청을 전송합니다.

인증 토큰을 발급받아 이후 요청의 권한을 확보하기 위해 사용됩니다.

매개변수
UserName[in] 토큰 발급 대상 사용자 이름입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 225 번째 라인에서 정의되었습니다.

226{
228 auto Request = SetupHttpRequest( Url, NETWORK_POST );
229
230 // OAuth2 password flow requires application/x-www-form-urlencoded
232 FormData.AddText(TEXT("grant_type"), TEXT("password"));
233 FormData.AddText(TEXT("username"), UserName);
234 FormData.AddText(TEXT("password"), UserName);
235 FormData.SetupHttpRequest(Request);
236
237 LogNetwork(ENetworkLogType::Post, *Request->GetURL(), *UserName);
238
239 Request->OnProcessRequestComplete().BindLambda(
240 [this, InDelegate, UserName](FHttpRequestPtr HttpRequest, FHttpResponsePtr HttpResponse, bool bSuccess)
241 {
243
244 FResponseUserToken ResponseData;
245
246 if (bSuccess && HttpResponse.IsValid())
247 {
248 const int32 ResponseCode = HttpResponse->GetResponseCode();
249
250 if (IsResSuccess(ResponseCode))
251 {
252 NETWORK_LOG(TEXT("[RES] RequestInterviewHello - Code: %d, Response: %s"), ResponseCode, *HttpResponse->GetContentAsString());
253
254 ResponseData.SetFromHttpResponse(HttpResponse);
255 ResponseData.PrintData();
256
257 access_token = ResponseData.access_token;
258
259 if (auto PS = ULingoGameHelper::GetLingoPlayerState(this))
260 PS->SetToken(ResponseData.access_token);
261
262 InDelegate.ExecuteIfBound(ResponseData, true);
263 }
264 else
265 {
266 NETWORK_LOG(TEXT("[POST] RequestUserToken failed - Code: %d, Response: %s"),
267 ResponseCode, *HttpResponse->GetContentAsString());
268 ShowNetworkErrorPopup(ResponseCode, HttpResponse->GetContentAsString());
269 InDelegate.ExecuteIfBound(ResponseData, false);
270 }
271 }
272 else
273 {
274 NETWORK_LOG(TEXT("[POST] RequestUserToken failed - bSuccess: %s, Response valid: %s"),
275 bSuccess ? TEXT("true") : TEXT("false"),
276 HttpResponse.IsValid() ? TEXT("true") : TEXT("false"));
277
278 int32 ErrorCode = HttpResponse.IsValid() ? HttpResponse->GetResponseCode() : 0;
279 FString ErrorContent = HttpResponse.IsValid() ? HttpResponse->GetContentAsString() : TEXT("Network connection failed");
280 ShowNetworkErrorPopup(ErrorCode, ErrorContent);
281
282 InDelegate.ExecuteIfBound(ResponseData, false);
283 }
284 });
285
287 Request->ProcessRequest();
288}
@ FormUrlEncoded
application/x-www-form-urlencoded (OAuth2 등)
FString access_token
인증 토큰 (로그인 후 저장)
static class ALingoPlayerState * GetLingoPlayerState(const UObject *WorldContextObject)
static FString users_token
Definition NetworkData.h:83
void PrintData() const
디버그 로그에 응답 내용을 출력합니다.
void SetFromHttpResponse(const TSharedPtr< class IHttpResponse, ESPMode::ThreadSafe > &Response)
HTTP 응답을 파싱해 상태 정보를 갱신합니다.

다음을 참조함 : FResponseUserToken::access_token, access_token, AddNetworkWaitCount(), FHttpMultipartFormData::AddText(), FormUrlEncoded, NetworkConfig::GetFullUrl(), ULingoGameHelper::GetLingoPlayerState(), IsResSuccess(), LogNetwork(), NETWORK_LOG, NETWORK_POST, Post, FResponseUserToken::PrintData(), FResponseUserToken::SetFromHttpResponse(), SetupHttpRequest(), FHttpMultipartFormData::SetupHttpRequest(), ShowNetworkErrorPopup(), RequestAPI::users_token.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestWriteQuestions()

void UKLingoNetworkSystem::RequestWriteQuestions ( FResponseWriteQuestionDelegate  InDelegate)

Write 문제 목록을 요청합니다.

쓰기 학습 단계의 문제 리스트를 서버에서 받아옵니다.

매개변수
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 348 번째 라인에서 정의되었습니다.

349{
350 // URL 형식: /scenario/stages/redis/{room_id}/{scenario_id}/{stage_type}/{level}
351 FString Endpoint = FString::Printf(TEXT("%s/%lld/%d/%d/%d"), *RequestAPI::scenario,
352 ULingoGameHelper::GetLingoGameState( GetWorld())->GetRoomId(),
353 1,
355 ULingoGameHelper::GetLingoGameState( GetWorld())->GetRoomLevel());
356 FString Url = NetworkConfig::GetFullUrl(Endpoint);
357 auto Request = SetupHttpRequest(Url, NETWORK_GET);
358
359 LogNetwork(ENetworkLogType::Get, *Request->GetURL());
360
361 Request->OnProcessRequestComplete().BindLambda(
362 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate](FHttpRequestPtr Req, FHttpResponsePtr ResPtr, bool bWasSuccessful)
363 {
364 if (!WeakThis.IsValid() || IsEngineExitRequested())
365 return;
366
367 WeakThis->AddNetworkWaitCount(-1);
368 FQuestWriteInfo ResponseData;
369
370 if (bWasSuccessful && ResPtr.IsValid())
371 {
372 const int32 ResponseCode = ResPtr->GetResponseCode();
373
374 NETWORK_LOG(TEXT("[RES] RequestWriteQuestions - Code: %d, Response: %s"), ResponseCode, *ResPtr->GetContentAsString());
375
376 if (IsResSuccess(ResponseCode))
377 {
378 ResponseData.SetFromHttpResponse(ResPtr);
379 InDelegate.ExecuteIfBound(ResponseData, true);
380 }
381 else
382 {
383 WeakThis->ShowNetworkErrorPopup(ResponseCode, ResPtr->GetContentAsString());
384 InDelegate.ExecuteIfBound(ResponseData, false);
385 }
386 }
387 else
388 {
389 NETWORK_LOG(TEXT("[POST] RequestWriteQuestions failed - bSuccess: %s, Response valid: %s"),
390 bWasSuccessful ? TEXT("true") : TEXT("false"),
391 ResPtr.IsValid() ? TEXT("true") : TEXT("false"));
392
393 int32 ErrorCode = ResPtr.IsValid() ? ResPtr->GetResponseCode() : 0;
394 FString ErrorContent = ResPtr.IsValid() ? ResPtr->GetContentAsString() : TEXT("Network connection failed");
395 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
396
397 InDelegate.ExecuteIfBound(ResponseData, false);
398 }
399 });
400
402 Request->ProcessRequest();
403}
Write 퀘스트 정보 구조체입니다.
bool IsValid() const
구조체 값이 유효한지 여부를 반환합니다.

다음을 참조함 : Get, NetworkConfig::GetFullUrl(), ULingoGameHelper::GetLingoGameState(), ULingoGameHelper::GetStageTypeIndex(), FQuestWriteInfo::IsValid(), LogNetwork(), NETWORK_GET, NETWORK_LOG, RequestAPI::scenario, SetupHttpRequest(), Write.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestWriteResult()

void UKLingoNetworkSystem::RequestWriteResult ( const FRequestWriteResult Result,
FResponseWriteResultDelegate  InDelegate 
)

Write 결과 제출 요청을 전송합니다.

쓰기 학습 결과를 서버에 기록하기 위해 호출합니다.

매개변수
Result[in] 제출할 결과 데이터입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 478 번째 라인에서 정의되었습니다.

479{
481 auto Request = SetupHttpRequest(Url, NETWORK_POST);
482
483 // Request Body 설정
484 FString RequestBody;
485 if (Result.ToJsonString(RequestBody))
486 Request->SetContentAsString(RequestBody);
487
488 LogNetwork(ENetworkLogType::Post, *Request->GetURL(), *RequestBody);
489
490 Request->OnProcessRequestComplete().BindLambda(
491 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate](FHttpRequestPtr Req, FHttpResponsePtr ResPtr, bool bWasSuccessful)
492 {
493 if (!WeakThis.IsValid() || IsEngineExitRequested())
494 return;
495
496 WeakThis->ShowLoadingCircle(false);
497
498 FResponseWriteResult ResponseData;
499
500 if (bWasSuccessful && ResPtr.IsValid())
501 {
502 const int32 ResponseCode = ResPtr->GetResponseCode();
503
504 NETWORK_LOG(TEXT("[RES] Code: %d, Response: %s"), ResponseCode, *ResPtr->GetContentAsString());
505
506 if (IsResSuccess(ResponseCode))
507 {
508 ResponseData.SetFromHttpResponse(ResPtr);
509 InDelegate.ExecuteIfBound(ResponseData, true);
510 }
511 else
512 {
513 WeakThis->ShowNetworkErrorPopup(ResponseCode, ResPtr->GetContentAsString());
514 InDelegate.ExecuteIfBound(ResponseData, false);
515 }
516 }
517 else
518 {
519 NETWORK_LOG(TEXT("[POST] RequestOcrExtract failed - bSuccess: %s, Response valid: %s"),
520 bWasSuccessful ? TEXT("true") : TEXT("false"),
521 ResPtr.IsValid() ? TEXT("true") : TEXT("false"));
522
523 int32 ErrorCode = ResPtr.IsValid() ? ResPtr->GetResponseCode() : 0;
524 FString ErrorContent = ResPtr.IsValid() ? ResPtr->GetContentAsString() : TEXT("Network connection failed");
525 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
526
527 InDelegate.ExecuteIfBound(ResponseData, false);
528 }
529 });
530
531 ShowLoadingCircle(true);
532 Request->ProcessRequest();
533}
static FString wriite_result
bool ToJsonString(FString &OutJson) const
구조체를 JSON 문자열로 변환합니다.

다음을 참조함 : NetworkConfig::GetFullUrl(), LogNetwork(), NETWORK_LOG, NETWORK_POST, Post, SetupHttpRequest(), FRequestWriteResult::ToJsonString(), RequestAPI::wriite_result.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ RequestWriteSubmit()

void UKLingoNetworkSystem::RequestWriteSubmit ( const TArray< FString > &  ImagePathArray,
TArray< FString >  InTargetText,
FResponseWriteSubmitDelegate  InDelegate 
)

Write 제출 요청을 전송합니다.

이미지 경로 목록과 타겟 텍스트를 서버로 제출해 OCR/채점 처리에 사용합니다.

매개변수
ImagePathArray[in] 업로드할 이미지 파일 경로 배열입니다.
InTargetText[in] 비교 대상 텍스트 배열입니다.
InDelegate[in] 응답 콜백입니다. 사이드이펙트: 네트워크 요청을 전송하고 로딩 UI 상태를 갱신합니다.

UKLingoNetworkSystem.cpp 파일의 409 번째 라인에서 정의되었습니다.

410{
412 auto Request = SetupHttpRequest(Url, NETWORK_POST);
413
415 for (FString ImageName : ImageNameArray)
416 {
417 if (!Form.AddFile(TEXT("files"), FString::Printf(TEXT("%s"), *ImageName)))
418 {
419 NETWORK_LOG(TEXT("[POST] OCR Extract: file load failed: %s"), *ImageName);
420 FResponseWriteSubmit EmptyResponse;
421 InDelegate.ExecuteIfBound(EmptyResponse, false);
422 return;
423 }
424 }
425 for (FString targetText : InTargetText)
426 {
427 Form.AddText(TEXT("target_texts"), targetText);
428 }
429
430 Form.SetupHttpRequest(Request);
431
432 LogNetwork(ENetworkLogType::Post, *Request->GetURL());
433
434 Request->OnProcessRequestComplete().BindLambda(
435 [WeakThis = TWeakObjectPtr<UKLingoNetworkSystem>(this), InDelegate](FHttpRequestPtr Req, FHttpResponsePtr ResPtr, bool bWasSuccessful)
436 {
437 if (!WeakThis.IsValid() || IsEngineExitRequested())
438 return;
439
440 WeakThis->ShowLoadingCircle(false);
441 FResponseWriteSubmit ResponseData;
442
443 if (bWasSuccessful && ResPtr.IsValid())
444 {
445 const int32 ResponseCode = ResPtr->GetResponseCode();
446
447 NETWORK_LOG(TEXT("[RES] Code: %d, Response: %s"), ResponseCode, *ResPtr->GetContentAsString());
448
449 if (IsResSuccess(ResponseCode))
450 {
451 ResponseData.SetFromHttpResponse(ResPtr);
452 InDelegate.ExecuteIfBound(ResponseData, true);
453 }
454 else
455 {
456 WeakThis->ShowNetworkErrorPopup(ResponseCode, ResPtr->GetContentAsString());
457 InDelegate.ExecuteIfBound(ResponseData, false);
458 }
459 }
460 else
461 {
462 NETWORK_LOG(TEXT("[POST] RequestOcrExtract failed - bSuccess: %s, Response valid: %s"),
463 bWasSuccessful ? TEXT("true") : TEXT("false"),
464 ResPtr.IsValid() ? TEXT("true") : TEXT("false"));
465
466 int32 ErrorCode = ResPtr.IsValid() ? ResPtr->GetResponseCode() : 0;
467 FString ErrorContent = ResPtr.IsValid() ? ResPtr->GetContentAsString() : TEXT("Network connection failed");
468 WeakThis->ShowNetworkErrorPopup(ErrorCode, ErrorContent);
469
470 InDelegate.ExecuteIfBound(ResponseData, false);
471 }
472 });
473
474 ShowLoadingCircle(true);
475 Request->ProcessRequest();
476}
static FString writes_submit
Write 답변 제출 엔드포인트입니다. POST /writes/submit
Definition NetworkData.h:87
Write Submit 응답 구조체입니다.

다음을 참조함 : FHttpMultipartFormData::AddFile(), FHttpMultipartFormData::AddText(), NetworkConfig::GetFullUrl(), LogNetwork(), NETWORK_LOG, NETWORK_POST, Post, SetupHttpRequest(), FHttpMultipartFormData::SetupHttpRequest(), RequestAPI::writes_submit.

+ 이 함수 내부에서 호출하는 함수들에 대한 그래프입니다.:

◆ SetupHttpRequest()

TSharedRef< IHttpRequest, ESPMode::ThreadSafe > UKLingoNetworkSystem::SetupHttpRequest ( const FString &  Url,
const FString &  Verb 
)
private

UKLingoNetworkSystem.cpp 파일의 143 번째 라인에서 정의되었습니다.

145{
146 auto RetRequest = FHttpModule::Get().CreateRequest();
147 RetRequest->SetURL(Url);
148 RetRequest->SetVerb(Verb);
149
150 // 기본 헤더
151 RetRequest->SetHeader(TEXT("Content-Type"), TEXT("application/json"));
152 RetRequest->SetHeader(TEXT("Authorization"), FString::Printf(TEXT("Bearer %s"), *access_token));
153
154 return RetRequest;
155}

다음을 참조함 : access_token.

다음에 의해서 참조됨 : RequestChatAudio(), RequestChatQuestion(), RequestDailyAudio(), RequestDailyQuestion(), RequestEvaluationResult(), RequestInterviewAnswer(), RequestInterviewHello(), RequestListenAudio(), RequestListenResult(), RequestListenScenario(), RequestReadResult(), RequestReadScenario(), RequestSpeakingJudges(), RequestSpeakResult(), RequestSpeakScenario(), RequestUserMe(), RequestUserRegister(), RequestUserToken(), RequestWriteQuestions(), RequestWriteResult(), RequestWriteSubmit().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ShowLoadingCircle()

void UKLingoNetworkSystem::ShowLoadingCircle ( bool  bShow)
private

LoadingCircle을 표시하거나 숨깁니다.

매개변수
bShow[in] true면 표시, false면 숨김

UKLingoNetworkSystem.cpp 파일의 92 번째 라인에서 정의되었습니다.

93{
94 if (UWorld* World = GetWorld())
95 {
96 if (ULoadingCircleManager* LoadingManager = ULoadingCircleManager::Get(World))
97 LoadingManager->LoadingCircle(bShow);
98 }
99}
전역 로딩 서클의 표시 여부를 관리하는 LocalPlayerSubsystem입니다.

다음에 의해서 참조됨 : RequestEvaluationResult().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

◆ ShowNetworkErrorPopup()

void UKLingoNetworkSystem::ShowNetworkErrorPopup ( int32  ResponseCode,
const FString &  ResponseContent 
)
private

네트워크 에러 팝업을 표시합니다.

매개변수
ResponseCode[in] HTTP 응답 코드입니다.
ResponseContent[in] HTTP 응답 본문입니다.

UKLingoNetworkSystem.cpp 파일의 101 번째 라인에서 정의되었습니다.

102{
103 UWorld* World = GetWorld();
104 if (!IsValid(World))
105 {
106 NETWORK_LOG(TEXT("[Network] Invalid World in ShowNetworkErrorPopup"));
107 return;
108 }
109
110 // JSON 응답 파싱
111 FString ErrorDetail = TEXT("Network request failed");
112
113 TSharedPtr<FJsonObject> JsonObject;
114 TSharedRef<TJsonReader<>> Reader = TJsonReaderFactory<>::Create(ResponseContent);
115
116 if (FJsonSerializer::Deserialize(Reader, JsonObject) && JsonObject.IsValid())
117 {
118 // "detail" 필드 추출
119 if (JsonObject->HasField(TEXT("detail")))
120 {
121 ErrorDetail = JsonObject->GetStringField(TEXT("detail"));
122 }
123 }
124 else
125 {
126 // JSON 파싱 실패 시 원본 응답 사용
127 if (!ResponseContent.IsEmpty())
128 {
129 ErrorDetail = ResponseContent;
130 }
131 }
132
133 // 팝업 표시
134 if (UPopupManager* PopupMgr = UPopupManager::Get(World))
135 {
136 FString Title = FString::Printf(TEXT("Error %d"), ResponseCode);
137 PopupMgr->ShowMsgBoxSimple(Title, ErrorDetail, EMsgBoxType::OK);
138
139 NETWORK_LOG(TEXT("[Network] Error Popup - Code: %d, Detail: %s"), ResponseCode, *ErrorDetail);
140 }
141}
팝업 관리자

다음을 참조함 : NETWORK_LOG, OK.

다음에 의해서 참조됨 : RequestEvaluationResult(), RequestListenScenario(), RequestReadScenario(), RequestSpeakScenario(), RequestUserMe(), RequestUserRegister(), RequestUserToken().

+ 이 함수를 호출하는 함수들에 대한 그래프입니다.:

멤버 데이터 문서화

◆ access_token

FString UKLingoNetworkSystem::access_token
private

인증 토큰 (로그인 후 저장)

UKLingoNetworkSystem.h 파일의 294 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : RequestUserToken(), SetupHttpRequest().

◆ NetworkWaitCount

int UKLingoNetworkSystem::NetworkWaitCount = 0
private

처리 중인 요청 수를 집계하는 카운터입니다.

UKLingoNetworkSystem.h 파일의 291 번째 라인에서 정의되었습니다.

다음에 의해서 참조됨 : AddNetworkWaitCount(), Initialize().


이 클래스에 대한 문서화 페이지는 다음의 파일들로부터 생성되었습니다.: