跳到主要内容

进行 HTTP 请求

在 IdeaXR 中,用 HTTPRequest 节点发出 HTTP 请求是最简单的方法。

我们接下来将创建一个简单的示例,我们会创建一个带有按钮的简单UI,按下该按钮时将发送对指定网址的HTTP请求。

使用代码脚本实现请求

准备场景

创建一个新的空场景,添加一个CanvasLayer作为根节点,并为其添加一个IVRScript脚本。然后给它添加两个子节点:一个Button和一个HTTPRequest节点。然后需要把以下信号连接到脚本上:

  • Button.pressed:按下按钮后,我们将发送请求。
  • HTTPRequest.request_completed:当请求完成后,我们将获取请求的数据作为参数。

http_request_prepare

编写脚本逻辑

以下是我们需要的代码,该网址指向一个在线API模拟器;它将返回一个预先定义好的JSON字符串,然后我们将解析它以获取对数据的访问权限。

extends CanvasLayer



func _on_按钮_pressed():
$HTTP请求.request("http://www.mocky.io/v2/5185415ba171ea3a00704eed")

func _on_HTTP请求_request_completed(result, response_code, headers, body):
var json = JSON.parse(body.get_string_from_utf8())
print(json.result)

其中body是一个字节数组(PoolByteArray),我们调用该类中的get_string_from_utf8()以字符串返回数组内容的副本,这时我们得到的是只是一串字符串。接下来我们需要使用 IdeaXR 中的JSON类中的parse()来解析字符串,并返回一个包含结果的JSONParseResult类,我们使用一个名为“json”的变量保存。我们可以在搜索帮助中查到JSONParseResult类的介绍。

JSONParseResult

然后我们打印返回的JSONParseResult中的result,包含解析过JSON的变量Variant。

你可以尝试运行这个案例,点击按钮,在短暂的停顿后,输出窗口有应该会打印一个字典类型{hello:world},hello是关键字,world是值,两者都是字符串。

请注意,你可能需要检查result是否等于RESULT_SUCCESS以及 JSON 解析错误是否发生。

关于result返回的类型枚举可以在搜索帮助里面直接搜索RESULT_SUCCESS查看。

result_enum

使用可视化脚本实现请求

准备场景

与上述使用IVRScript的准备相同,我们依旧是创建一个新的空场景,添加一个CanvasLayer作为根节点。然后给它添加两个子节点:一个Button和一个HTTPRequest节点。不过我们在这里给CanvasLayer添加一个IVRVisualScript脚本,并将Button.pressedHTTPRequest.request_completed信号进行连接。

编写可视化脚本逻辑

首先,我们定义按钮按下后的操作,我们需要将http请求节点拖入可视化脚本,并调用该节点中的request方法,在url中输入http://www.mocky.io/v2/5185415ba171ea3a00704eed,然后进行连线。

define_signal

之后我们需要编写请求完成后读取返回配置的方法,方法与脚本相同,我们先使用get_string_from_utf8()得到字符串:

get_string_from_utf8

再通过JSON类将其转化为正确的类型:

parse

再将其进行打印到输出端口:

print_json

注意

这里关于result是属性的获取,在交互编辑器中无法直接获取属性,所以需要使用call()方法调用get_result()来获取。

这样,我们的可视化脚本就已经完成了。运行场景点击按钮,输出窗口会打印{hello:world}

print_hello_world

将数据发送到服务器

到目前为止, 我们仅限于从服务器上请求数据. 但如果你需要向服务器发送数据呢?这里有一个常见的方法:

func _make_post_request(url, data_to_send, use_ssl):
# 将数据转换为json字符串
var query = JSON.print(data_to_send)
# 添加 'Content-Type' 标头:
var headers = ["Content-Type: application/json"]
$HTTPRequest.request(url, headers, use_ssl, HTTPClient.METHOD_POST, query)

请记住,在发送另一个请求之前,您必须等待请求完成。一次发出多个请求需要每个请求有一个节点。常见的策略是在运行时根据需要创建和删除HTTPRequest节点。