๐ ์ธ๋ฆฌ์ผ ์์ง์์ Http ์์ฒญ์ผ๋ก ํต์ ํด๋ณด์.
๋ฐฑ์๋ ์๋ฒ๋ฅผ ๊ตฌ์ถํ์ฌ API ํต์ ์ ํ ์ ์๋ ํ๋ก์ ํธ๋ฅผ ํด๋ณด๊ณ ์ถ์ด์ก์ต๋๋ค.
๊ทธ๋์ ์ธ๋ฆฌ์ผ ์์ง์์ Http ์์ฒญ์ ๋ณด๋ด๊ณ ๊ฐ์ ๋ฐ์
JSON์ ์ฒ๋ฆฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ฆฌ์ฆ๋ก ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํฉ๋๋ค.
ํ๋ก์ ํธ๋ช
.Build.cs
ํ์ผ์ ์ด์ด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ ์๋์ Http, Json์ ์์กด์ฑ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ๊ฒ ์ต๋๋ค.
public class API_Test_Project : ModuleRules
{
public API_Test_Project(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore","UMG" });
// ์ถ๊ฐ
PrivateDependencyModuleNames.AddRange(new string[] { "HTTP", "Json" });
}
}
C++๋ก ๊ฒ์ ๋ชจ๋๋ฅผ ํ๋ ๋ง๋ค์ด ์ฃผ๊ฒ ์ต๋๋ค.
GameModeBase ์ ํํ์๊ณ ์ด๋ฆ์ ์ ๋นํ ์ง์ด ์ฃผ์ธ์.
์ฐ์ ํค๋๋ฅผ ์ถ๊ฐํด์ฃผ๊ฒ ์ต๋๋ค.
์ผ๋จ Http.h
ํ๋๋ง ์ถ๊ฐํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ ๋ณ์ํ๋๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค.
ํด๋น ๋ณ์๋ HTTP ์์ฒญ์ ๊ด๋ฆฌํ๋ FHttpModule๋ก HTTP ์์ฒญ์ ์์ฑ, ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
public:
FHttpModule* Http;
};
์ด๋ฒ์ HTTP ์์ฒญ์ ์๋ต์ ์ฒ๋ฆฌํ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ์ธํด์ฃผ๊ฒ ์ต๋๋ค.
public:
void OnResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
};
HTTP ์์ฒญ์ ๋ณด๋ธ ํ ์๋ฒ๋ก๋ถํฐ ์๋ต์ ๋ฐ์ ๋ ํธ์ถ๋ฉ๋๋ค.
๊ฐ ๋งค๊ฐ๋ณ์์ ๋ํด์ ์ค๋ช ํ์๋ฉด ์๋์ ๊ฐ์ต๋๋ค.
- FHttpRequestPtr Request / ์์ฒญ์ ๋ํ๋ด๋ ํฌ์ธํฐ๋ก ์ ๋ณด๋ฅผ ํ์ธํ๊ฑฐ๋ ์์ฒญ์ ์ถ์ ํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
- FHttpResponsePtr Response / ์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต ๋ฐ์ดํฐ๋ฅผ ์ด ๊ฐ์ฒด์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
- bool bWasSuccessful / ์์ฒญ ์ฑ๊ณต ์ฌ๋ถ ๋ฐํ
HTTP ์์ฒญ์ ์์ฑํ๊ณ ์์ฒญํ ๋ด์ฉ์ ์ด ํจ์์ ์์ฑํ๊ฒ ์ต๋๋ค.
์ธ์๋ก HTTP ์์ฒญ์ ๋ณด๋ผ URL๊ณผ ์์ฒญ ๋ฐฉ์์ ๊ฐ์ง๋๋ค.
public:
UFUNCTION(BlueprintCallable)
void HttpCall(const FString& InURL, const FString& InVerb);
};
์ ์ฒด ํค๋ ํ์ผ ์ฝ๋์
๋๋ค.
์์ฑ์ ๋ถ๋ถ์์ Http ๋ณ์์ ๋ํด์ ์ด๊ธฐํ๋ฅผ ํ๊ฒ ์ต๋๋ค.
FHttpModule::Get()
์ Unreal Engine์์ ์ ๊ณตํ๋ ์ฑ๊ธํค ํจํด์ผ๋ก ๊ตฌํ๋ FHttpModule ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์์
๋๋ค.
HTTP ์์ฒญ์ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๋ชจ๋์ธ FHttpModule์ ์ธ์คํด์ค๋ฅผ ์ ์ญ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ์ ๊ณตํฉ๋๋ค.
์ฐ์ Http๋ฅผ ์์ฒญํ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ผ ํฉ๋๋ค.
ํด๋น ๊ฐ์ฒด๋ IHttpRequest
ํ์
์ ์ฌ์ฉํฉ๋๋ค.
IHttpRequest
๋ Unreal Engine์ HTTP ์์ฒญ์ ๋ํ๋ด๋ ์ธํฐํ์ด์ค์
๋๋ค.
HTTP ์์ฒญ์ ์์ฑํ๊ณ ์๋ฒ์ ์ ์กํ๋ฉฐ, ์๋ต์ ๋ฐ์ ๋ ์ฌ์ฉํ ์ ์๋ ๋ฉ์๋๋ค์ ์ ๊ณตํฉ๋๋ค.
IHttpRequest
์์ฒด๋ ์ธํฐํ์ด์ค์ด๊ธฐ ๋๋ฌธ์ ์ง์ ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ผ๋ฉฐ,
Unreal Engine์์ ์ ๊ณตํ๋ HTTP ๋ชจ๋(FHttpModule)์ ํตํด ํด๋น ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๊ฐ ๋ฐํ๋ฉ๋๋ค.
Http ์์ฒญ ๊ฐ์ฒด๋ฅผ ์์ฑํด Request ๋ณ์์ ์ ์ฅํฉ๋๋ค.
// ์ง์ ๋ URL๋ก HTTP ์์ฒญ์ ๋ณด๋ธ๋ค.
// InVerb๋ Get,Post ๋ฑ ์์ฒญ ๋ฉ์๋์ด๋ค.
void AGM_API_Test::HttpCall(const FString& InURL, const FString& InVerb)
{
// Http ์์ฒญ ๊ฐ์ฒด๋ฅผ ์์ฑํด Request๋ณ์์ ์ ์ฅํ๋ค.
TSharedRef<IHttpRequest> Request = Http->CreateRequest();
}
IHttpRequest
ํ์
์ ์ฃผ์ ๋ฉ์๋๋ ์๋ 4๊ฐ์ง๊ฐ ์์ต๋๋ค.
- SetURL() - ์์ฒญํ URL์ ์ค์
- SetVerb() - HTTP ๋ฉ์๋(GET, POST ๋ฑ)๋ฅผ ์ค์
- SetHeader() - ์์ฒญ์ ํค๋๋ฅผ ์ค์
- ProcessRequest() - ์์ฒญ์ ์ ์ก
์ด ํ์
๋ค์ ๋ํด์ ์ด์ ์ค์ ํด์ฃผ์ด์ผ ํฉ๋๋ค.
์ผ๋จ 3๋ฒ ๋ฉ์๋๋ ์ ์ธํ๊ณ ์งํํ๊ฒ ์ต๋๋ค.
์ฌ๊ธฐ์ URL๊ณผ Verb๋ ์ด๋ฏธ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์์ฃ ?
๊ทธ๋๋ก ๊ฐ์ ๋ฃ์ด ์ค๋๋ค.
// ์ง์ ๋ URL๋ก HTTP ์์ฒญ์ ๋ณด๋ธ๋ค.
// InVerb๋ Get,Post ๋ฑ ์์ฒญ ๋ฉ์๋์ด๋ค.
void AGM_API_Test::HttpCall(const FString& InURL, const FString& InVerb)
{
// Http ์์ฒญ ๊ฐ์ฒด๋ฅผ ์์ฑํด Request๋ณ์์ ์ ์ฅํ๋ค.
TSharedRef<IHttpRequest> Request = Http->CreateRequest();
Request->SetURL(InURL); // URL ์ค์
Request->SetVerb(InVerb); // ๋ฉ์๋ ์ค์
}
์ด๋ ๊ฒ Request
๋ณ์์ ์ํ๋ ์์ฒญ์ ๋ด์ฉ์ด ์ ์ฅ๋์ด ์์ต๋๋ค.
์ด๋ฅผ ProcessRequest()
ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ์ ์ ์กํ ์ ์์ต๋๋ค.
์์ฒญ์ ์ ์กํ๊ณ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋๋ก ํ๊ฒ ์ต๋๋ค.
// ์ง์ ๋ URL๋ก HTTP ์์ฒญ์ ๋ณด๋ธ๋ค.
// InVerb๋ Get,Post ๋ฑ ์์ฒญ ๋ฉ์๋์ด๋ค.
void AGM_API_Test::HttpCall(const FString& InURL, const FString& InVerb)
{
// Http ์์ฒญ ๊ฐ์ฒด๋ฅผ ์์ฑํด Request๋ณ์์ ์ ์ฅํ๋ค.
TSharedRef<IHttpRequest> Request = Http->CreateRequest();
Request->SetURL(InURL); // URL ์ค์
Request->SetVerb(InVerb); // ๋ฉ์๋ ์ค์
Request->SetHeader("Content-Type", TEXT("application/json")); // ์์ฒญ์ ํค๋ ์ค์
// HTTP ์์ฒญ ์ ์ก
Request->ProcessRequest();
// ์ ์กํ์์ ์๋ฆฌ๋ ๋ก๊ทธ ์ถ๋ ฅ
UE_LOG(LogTemp, Warning, TEXT("HttpCall initiated. URL: %s, Verb: %s"), *InURL, *InVerb);
}
์ฌ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ด ์๋๋ฐ, ๋ฐ๋ก OnResponseReceived
์ฝ๋ฐฑ ํจ์์ ๋ฐ์ธ๋ฉ์ ์งํํด์ฃผ์ด์ผ ํฉ๋๋ค.
HTTP ์์ฒญ์ด ์๋ฃ๋๊ณ ์๋ฒ๋ก๋ถํฐ ์๋ต์ ๋ฐ์์ ๋, ํธ์ถ๋ ํจ์์
๋๋ค.
์๋๊ฐ ์ ์ฒด ์ฝ๋์ ๋๋ค.
// ์ง์ ๋ URL๋ก HTTP ์์ฒญ์ ๋ณด๋ธ๋ค.
// InVerb๋ Get,Post ๋ฑ ์์ฒญ ๋ฉ์๋์ด๋ค.
void AGM_API_Test::HttpCall(const FString& InURL, const FString& InVerb)
{
// Http ์์ฒญ ๊ฐ์ฒด๋ฅผ ์์ฑํด Request๋ณ์์ ์ ์ฅํ๋ค.
TSharedRef<IHttpRequest> Request = Http->CreateRequest();
// Http ์์ฒญ์ด ์๋ฃ๋๋ฉด OnResponseReceivedํจ์๊ฐ ํธ์ถ๋๋๋ก ๋ฐ์ธ๋ฉํ๋ค.
Request->OnProcessRequestComplete().BindUObject(this, &AGM_API_Test::OnResponseReceived);
Request->SetURL(InURL); // URL ์ค์
Request->SetVerb(InVerb); // ๋ฉ์๋ ์ค์
Request->SetHeader("Content-Type", TEXT("application/json")); // ์์ฒญ์ ํค๋ ์ค์
// HTTP ์์ฒญ ์ ์ก
Request->ProcessRequest();
// ์ ์กํ์์ ์๋ฆฌ๋ ๋ก๊ทธ ์ถ๋ ฅ
UE_LOG(LogTemp, Warning, TEXT("HttpCall initiated. URL: %s, Verb: %s"), *InURL, *InVerb);
}
์ด๋ฒ ์ค์ต์์๋ ๊ฐ๋จํ๊ฒ ์๋ต์ ์์ฒญํ๊ณ , ์ฝ๋ฐฑ์ ๋ฐ๋ ๋ถ๋ถ๊น์ง๋ง ํ๊ฒ ์ต๋๋ค.
๊ฐ ์ํฉ์ ๋ํ ์์ธ์ฒ๋ฆฌ๋ ๋น์ฐํ ํด์ผ๊ฒ ์ฃ ?
- ์์ฒญ์ด ์ฑ๊ณตํ๋๊ฐ?
- ์๋ต์ด ์ ํจํ๊ฐ?
2๊ฐ์ง์ ๋ํด์ ์์ธ์ฒ๋ฆฌ๋ฅผ ์งํํ๊ฒ ์ต๋๋ค.
void AGM_API_Test::OnResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
// ์์ฒญ์ด ์ฑ๊ณตํ๋์ง, ์๋ต์ด ์ ์ํ์ง ๊ฒ์ฌํ๋ค.
if (!bWasSuccessful || !Response.IsValid())
{
UE_LOG(LogTemp, Error, TEXT("HTTP request failed. URL: %s"), *Request->GetURL());
return;
}
}
์๋ฒ๋ก๋ถํฐ ๋ฐ์ ์๋ต ๋ฐ์ดํฐ๊ฐ Response
์ธ์๋ผ๊ณ ์ค๋ช
ํ์์ต๋๋ค.
Response
์์ ์๋ต ์ํ ์ฝ๋์ ์๋ต ๋ณธ๋ฌธ์ ๋ฌธ์์ด๋ก ๊ฐ์ ธ์ ์ถ๋ ฅํด๋ณด๊ฒ ์ต๋๋ค.
void AGM_API_Test::OnResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful)
{
// ์์ฒญ์ด ์ฑ๊ณตํ๋์ง, ์๋ต์ด ์ ์ํ์ง ๊ฒ์ฌํ๋ค.
if (!bWasSuccessful || !Response.IsValid())
{
UE_LOG(LogTemp, Error, TEXT("HTTP request failed. URL: %s"), *Request->GetURL());
return;
}
// ์๋ต ์ํ ์ฝ๋๋ฅผ ๊ฐ์ ธ์จ๋ค.
int32 StatusCode = Response->GetResponseCode();
// ์๋ต ๋ณธ๋ฌธ์ ๋ฌธ์์ด๋ก ๊ฐ์ ธ์ด
FString ResponseContent = Response->GetContentAsString();
// ์์ฒญ์ด ์๋ฃ๋์์์ ์ถ๋ ฅ
UE_LOG(LogTemp, Warning, TEXT("HTTP request completed. Status Code: %d, URL: %s"), StatusCode, *Request->GetURL());
UE_LOG(LogTemp, Warning, TEXT("Response Content: %s"), *ResponseContent);
}
๋ง๋ ๊ฒ์๋ชจ๋ BP๋ก ๋ง๋ค์ด ์ฃผ๊ณ HttpCall()
ํจ์๋ฅผ Begin Play
์ ์คํํ์์ต๋๋ค.
์ ๋นํ ํ
์คํธ ๋งํฌ๋ฅผ ์๋ฌด๊ฑฐ๋ ๋ฃ์ด ์ฃผ์๊ณ ์คํํด์ฃผ์ธ์.
๊ทธ๋ฆฌ๊ณ ์ถ๋ ฅ ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด?
์ด 3๊ฐ์ ๋ก๊ทธ๊ฐ ์ ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
- ์์ฒญ ๋ก๊ทธ
- ์๋ต ์ํ ์ฝ๋ 200
- ์๋ต ๋ณธ๋ฌธ
HTTP ์์ฒญ๊ณผ ์๋ต์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃํ์์ต๋๋ค.
ํ์ง๋ง ๋ณธ๋ฌธ์ String์ผ๋ก ๋ฐ์์์ผ ์ค์ ๋ฐ์ดํฐ๋ก ์ฌ์ฉํ๊ธฐ ์ด๋ ต์ฃ .
๋ค์ ํฌ์คํ ์์ ํด๋น Json ๋ฐ์ดํฐ์์ ์ํ๋ ๋ด์ฉ์ ์ถ์ถํด๋ณด๊ฒ ์ต๋๋ค,.