HOME / 第 6 部分 · 数据与进阶开发 / 第 70 课
MODULE 6 · 数据与进阶开发

第 70 课 · HTTP 请求与在线数据

⏱ 预计时长 35 分钟📊 难度 进阶📚 模块 第 6 部分 · 数据与进阶开发

🎯 本课学习目标

在线排行榜、每日签到、下载更新——网络功能本课入门:HTTP 请求。

📖 详细教学步骤

准备 HTTPRequest搭建

  1. 添加节点 HTTPRequest(无头节点,负责请求)
  2. 请求完成会发 request_completed 信号

💡 本地测试可先用公开测试 API(如 httpbin.org)。

GET 请求代码

发起 GET 并处理返回:

GDSCRIPTextends Node

@onready var http: HTTPRequest = $HTTPRequest

func _ready():
    http.request_completed.connect(_on_completed)
    fetch_weather()

func fetch_weather():
    var url = "https://httpbin.org/json"
    var error = http.request(url)
    if error != OK:
        print("请求失败:", error)

func _on_completed(result, response_code, headers, body):
    if response_code == 200:
        var json = JSON.parse_string(body.get_string_from_utf8())
        print("收到数据:", json)
        $Label.text = str(json)
    else:
        print("HTTP 错误:", response_code)

POST 请求(带数据)代码

提交数据(如上传分数):

GDSCRIPTfunc upload_score(score: int, name: String):
    var url = "https://example.com/api/score"
    var data = JSON.stringify({"score": score, "name": name})
    var headers = ["Content-Type: application/json"]
    # 发起 POST
    http.request(url, headers, HTTPClient.METHOD_POST, data)

下载文件代码

下载图片/资源到本地:

GDSCRIPTfunc download_image(url: String):
    http.request(url)

func _on_completed(result, code, headers, body):
    if code == 200:
        # 保存到 user://
        var file = FileAccess.open("user://downloaded.png", FileAccess.WRITE)
        file.store_buffer(body)
        file.close()
        print("下载完成!")

超时与错误处理代码

网络不可靠,必须有兜底:

GDSCRIPTfunc _on_completed(result, code, headers, body):
    if result != HTTPRequest.RESULT_SUCCESS:
        print("网络错误,请重试")
        return
    if code != 200:
        print("服务器错误:", code)
        return
    # 成功处理...

HTTPS 与平台注意注意

  • Godot 默认支持 HTTPS
  • Web 导出跨域需服务器开 CORS
  • 请求是异步的,不会卡游戏
  • 别在 _ready 里同步阻塞网络
⚠️
request_completed 没触发?

检查 URL 是否可访问、请求是否真的发起了(print 错误码)。网络环境可能屏蔽了外网。

⚠️
解析 JSON 报错?

有些 API 返回不是标准 JSON。先用 print 打印 body 看原始内容。

🧪 动手试一试

🏋️ 课后练习

写一个「在线小游戏公告」:启动时 GET 一个 JSON,解析出公告标题显示在 HUD 上,失败则显示离线提示。

HTTPRequest + request_completed + JSON.parse_string。

💡

用 httpbin.org、jsonplaceholder.typicode.com 等免费 API 练手。

💡

网络请求尽量走单例(如 ApiManager),统一管理。

🎓 本课小结

HTTPRequest 发起网络请求:request 异步执行、request_completed 处理返回;GET 取数据、POST 提交、body 存文件;注意超时与错误兜底。