# 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 주소의 요청 수를 확인하시기 바랍니다.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.overdare.com/korean/manual/script-manual/events-and-communication/json-and-http.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
