> For the complete documentation index, see [llms.txt](https://docs.overdare.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.overdare.com/korean/manual/script-manual/events-and-communication/json-and-http.md).

# JSON과 HTTP 통신

## 개요

HttpService를 사용하면 외부 Http 서버와 통신할 수 있습니다. 외부 API 서버에서 데이터를 가져와 월드에 활용하거나, 데이터를 외부 API 서버로 보낸 후 응답받은 데이터를 월드에 활용할 수 있습니다.

## 사용 방법

| 기능                    | 설명                                           |
| --------------------- | -------------------------------------------- |
| GetAsync(url)         | url의 응답 받기                                   |
| PostAsync(url, data)  | url로 data를 보내고 응답 받기                         |
| JSONEncode(tableData) | table 형식의 tableData를 JSON string 형태로 변환 및 반환 |
| JSONDecode(json)      | JSON 형식의 JSON을 table 형태로 변환 및 반환             |

## URL에서 응답 받기

baseUrl 변수에 입력된 url 링크에 HTTP GET 요청을 보내고 응답을 받아 response 변수에 저장하고 print하는 예시 코드입니다.

```lua
-- HttpService 불러오기
local HttpService = game:GetService("HttpService")
local baseUrl = "HTTP URL을 입력하세요"

local success, errorMessageOrResult, response = nil, nil, nil

local function HttpGet()
    -- 비동기 요청이 실패하거나 오류가 발생할 수 있으므로 pcall()로 예외 처리
    success, errorMessageOrResult = pcall(function()
        -- "baseUrl" 주소로 HTTP GET 요청을 보낸 후 받은 응답을 "response" 변수에 저장
        response = HttpService:GetAsync(baseUrl)
    end)
    
    local messageSuccess = string.format("success: %s", success)
    local messageErrorOrResult = string.format("errorMessageOrResult: %s", errorMessageOrResult)
    local messageResponse = string.format("response: %s", response)
    
    print("messageSuccess: ", messageSuccess)
    print("messageErrorOrResult: ", messageErrorOrResult)
    print("messageResponse: ", messageResponse)
end
```

## URL에 JSON 데이터 보내고 응답 받기

baseUrl 변수에 입력된 url 링크에 월드에서 사용하던 table 데이터를 JSON으로 인코딩하여 HTTP POST 요청을 보내고 응답을 받아 response 변수에 저장하고 print하는 예시 코드입니다.

```lua
-- HttpService 불러오기
local HttpService = game:GetService("HttpService")
local baseUrl = "HTTP URL을 입력하세요"

local success, errorMessageOrResult, response = nil, nil, nil

local function HttpPost()
    -- URL로 보낼 데이터 정의
    local data = 
    {
        ["message"] = "Hello OVERDARE!",
        ["data"] = 10,
    }

    -- data를 JSON으로 인코딩
    local jsonData = HttpService:JSONEncode(data)

    -- 비동기 요청이 실패하거나 오류가 발생할 수 있으므로 pcall()로 예외 처리
    success, errorMessageOrResult = pcall(function()
        -- "baseUrl" 주소로 "jsonData" 데이터와 함께 HTTP POST 요청을 보낸 후 받은 응답을 "response" 변수에 저장
        response = HttpService:PostAsync(baseUrl, jsonData)
    end)

    local messageSuccess = string.format("success: %s", success)
    local messageErrorOrResult = string.format("errorMessageOrResult: %s", errorMessageOrResult)
    local messageResponse = string.format("response: %s", response)
    
    print("messageSuccess: ", messageSuccess)
    print("messageErrorOrResult: ", messageErrorOrResult)
    print("messageResponse: ", messageResponse)
end
```

## URL에서 응답 받은 JSON 데이터 활용하기

baseUrl 변수에 입력된 url 링크에 HTTP GET 요청을 보내고 응답을 받아 response 변수에 저장하고 응답받은 데이터가 JSON이라는 가정 하에 table로 Decoding한 후 print하는 예시 코드입니다.

```lua
-- HttpService 불러오기
local HttpService = game:GetService("HttpService")
local baseUrl = "HTTP URL을 입력하세요"

local success, errorMessageOrResult, response = nil, nil, nil

local function HttpGetApplication()
    -- 비동기 요청이 실패하거나 오류가 발생할 수 있으므로 pcall()로 예외 처리
    success, errorMessageOrResult = pcall(function()
        -- "baseUrl" 주소로 HTTP GET 요청을 보낸 후 받은응답을 "response" 변수에 저장
        response = HttpService:GetAsync(baseUrl)
        -- JSON 문자열을 디코딩하여 table 형식으로 "response" 변수에 저장
        response = HttpService:JSONDecode(response)
    end)

    local messageSuccess = string.format("success: %s", success)
    local messageErrorOrResult = string.format("errorMessageOrResult: %s", errorMessageOrResult)
    local messageResponse = string.format("response.data: %s", response.data)
    
    print("messageSuccess: ", messageSuccess)
    print("messageErrorOrResult: ", messageErrorOrResult)
    print("messageResponse: ", messageResponse)
end
```

## 주의사항

사용하시는 API 주소 마다 분당 요청 수 등의 제한이 있을 수 있습니다. 원하는 기능 구현에 있어 반드시 해당 API 주소의 요청 수를 확인하시기 바랍니다.
