进行 HTTP 请求
在 IdeaXR 中,用 HTTPRequest 节点发出 HTTP 请求是最简单的方法。
我们接下来将创建一个简单的示例,我们会创建一个带有按钮的简单UI,按下该按钮时将发送对指定网址的HTTP请求。
使用代码脚本实现请求
准备场景
创建一个新的空场景,添加一个CanvasLayer
作为根节点,并为其添加一个IVRScript
脚本。然后给它添加两个子节点:一个Button
和一个HTTPRequest
节点。然后需要把以下信号连接到脚本上:
- Button.pressed:按下按钮后,我们将发送请求。
- HTTPRequest.request_completed:当请求完成后,我们将获取请求的数据作为参数。
编写脚本逻辑
以下是我们需要的代码,该网址指向一个在线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中的result,包含解析过JSON的变量Variant。
你可以尝试运行这个案例,点击按钮,在短暂的停顿后,输出窗口有应该会打印一个字典类型{hello:world}
,hello是关键字,world是值,两者都是字符串。
请注意,你可能需要检查result
是否等于RESULT_SUCCESS
以及 JSON 解析错误是否发生。
关于result返回的类型枚举可以在搜索帮助里面直接搜索RESULT_SUCCESS查看。
使用可视化脚本实现请求
准备场景
与上述使用IVRScript的准备相同,我们依旧是创建一个新的空场景,添加一个CanvasLayer作为根节点。然后给它添加两个子节点:一个Button和一个HTTPRequest节点。不过我们在这里给CanvasLayer
添加一个IVRVisualScript
脚本,并将Button.pressed
和HTTPRequest.request_completed
信号进行连接。
编写可视化脚本逻辑
首先,我们定义按钮按下后的操作,我们需要将http请求
节点拖入可视化脚本,并调用该节点中的request方法,在url中输入http://www.mocky.io/v2/5185415ba171ea3a00704eed
,然后进行连线。
之后我们需要编写请求完成后读取返回配置的方法,方法与脚本相同,我们先使用get_string_from_utf8()
得到字符串:
再通过JSON类将其转化为正确的类型:
再将其进行打印到输出端口:
注意
这里关于result
是属性的获取,在交互编辑器中无法直接获取属性,所以需要使用call()
方法调用get_result()
来获取。
这样,我们的可视化脚本就已经完成了。运行场景点击按钮,输出窗口会打印{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节点。