Up to date

This page is up to date for Godot 4.2. If you still find outdated information, please open an issue.

發出 HTTP 請求

為什麼使用 HTTP?

`HTTP 請求 <https://developer.mozilla.org/en-US/docs/Web/HTTP>`_可以用來與 Web 伺服器以及其他非 Godot 程式通信。

與 Godot 的其他網路功能(例如:ref:高階多人遊戲 <doc_high_level_multiplayer>)相比,HTTP 請求的額外開銷更大,起步也更慢,所以並不適合即時通信,也不善於進行多人遊戲中常見的大量較小更新的發送。

HTTP, however, offers interoperability with external web resources and is great at sending and receiving large amounts of data, for example to transfer files like game assets. These assets can then be loaded using runtime file loading and saving.

所以 HTTP 可以用在遊戲的登錄系統、大廳瀏覽器,可以從 Web 獲取資訊,也可以下載遊戲素材。

本教學假設您對 Godot 和 Godot 編輯器有一定的了解。請參閱 簡介逐步 教學課程,特別是其 節點和場景 和:參考: 如果需要,建立您的第一個腳本<doc_scripting_first_script> 頁面。

Godot 中的 HTTP 請求

在Godot中, 用 HTTPRequest 節點發出HTTP請求是最簡單的方法. 它繼承自更低級別的 HTTPClient , 相關的教學見 here.

對於此範例,我們將向 GitHub 發出 HTTP 請求以檢索最新 Godot 版本的名稱。

警告

當匯出到 Android 時,在匯出專案或使用一鍵部署之前,確保在 Android 匯出預設中啟用 INTERNET 許可權。否則,任何形式的網路通信都會被 Android 系統阻止。

準備 SDK

建立一個新的空場景,新增一個根節點 <class_Node>` 並向其新增腳本。然後加入一個 HTTPRequest <class_HTTPRequest>` 節點作為子節點。

../../_images/rest_api_scene.webp

建立內容

當專案啟動時(所以在 _ready() 中),我們將使用 HTTPRequest <class_HTTPRequest> 節點向 Github 發送 HTTP 請求,一旦請求完成,我們就將解析傳回的JSON 資料,搜尋「name」欄位並將其列印到控制台。

extends Node

func _ready():
    $HTTPRequest.request_completed.connect(_on_request_completed)
    $HTTPRequest.request("https://api.github.com/repos/godotengine/godot/releases/latest")

func _on_request_completed(result, response_code, headers, body):
    var json = JSON.parse_string(body.get_string_from_utf8())
    print(json["name"])

儲存腳本和場景,然後執行專案。 Github 上最新的 Godot 版本的名稱應列印到輸出紀錄中。有關解析 JSON 的更多信息,請參閱 JSON <class_JSON>` 的類別參考。

請注意, 您可能需要檢查 result 是否等於 RESULT_SUCCESS 以及JSON解析錯誤是否發生, 要瞭解更多資訊, 請參閱JSON型別參考和 HTTPRequest .

請記住, 在發送另一個請求之前, 您必須等待請求完成. 一次發出多個請求需要每個請求有一個節點. 常見的策略是在運作時根據需要建立和刪除HTTPRequest節點.

建立 Godot 伺服器

到目前為止, 我們僅限於從伺服器上請求資料. 但如果你需要向伺服器發送資料呢?這裡有一個常見的方法:

var json = JSON.stringify(data_to_send)
var headers = ["Content-Type: application/json"]
$HTTPRequest.request(url, headers, HTTPClient.METHOD_POST, json)

建立內容

當然, 您也可以設定自訂的HTTP頭部. 它們以字串陣列的形式給出, 每個字串都包含一個格式為 "header: value" 的頭部. 例如, 要設定自訂使用者代理(HTTP的 user-agent 頭部部分), 您可以像這樣使用:

$HTTPRequest.request("https://api.github.com/repos/godotengine/godot/releases/latest", ["User-Agent: YourCustomUserAgent"])

警告

此外, 在使用授權呼叫API時, 請注意有人可能會分析和反編譯已發行的應用程式, 因此可能會存取到任何嵌入程式的授權資訊, 如權杖, 使用者名或密碼等. 這意味著在遊戲中嵌入諸如資料庫存取憑證之類的東西通常不是一個好主意. 盡可能避免提供對攻擊者有用的資訊.