fetch形式的HTTPS/HTTP请求 link

Ren’Py支持fetch形式的HTTP/HTTPS请求,使用 renpy.fetch 函数。该函数:

  • 支持Get、Post和Put请求。

  • 支持以Post和Put形式将数据或json发送到服务端。

  • Can return the result as bytes, a string, or a json object.

  • 可以Byte、字符串或Json对象作为结果返回。

在游戏启动之后,fetch函数也可以用在Ren’Py主线程中。 其可以在各个平台使用,包括电脑、手机和Web平台。在Web平台使用时,从其他服务器上fetch数据需要自身服务器支持 CORS

下面是个非常简单的例子,从服务器获取新闻资讯:

$ news = renpy.fetch("https://example.com/news.txt", result="text")
"新闻如下: [news]"

这个例子向服务端发送Json,并得到返回的Json:

$ result = renpy.fetch("https://example.com/api", json={"name": "Ren'Py"}, result="json")

任何带网络通信的程序都需要考虑安全问题,尤其使用 renpy.fetch 函数获取多媒体资源时。 (Ren’Py自身基本没有抵御恶意图片、视频和音频文件的能力。)

renpy.fetch(url, method=None, data=None, json=None, content_type=None, timeout=5, result='bytes', params=None) link

该函数向指定URL发送一个HTTP(或HTTPS)请求,并返回请求的内容。 若请求失败,则抛出FetchError异常。异常中包含了失败的描述文本。(但该异常可能并不适合向用户展示。)

url

fetch的目标URL。

method

请求方式。通常是“GET”、“POST”和“PUT”中某一种,但也有可能是其他HTTP请求方式。 若 datajson 的值不是None,默认使用“POST”方式。其他情况则默认使用“GET”方式。

data

若非None,请求时,将该值以二进制字符串数据形式发送。

json

若非None,请求是,将该值以Json对象形式发送。该参数的优先级高于 data

content_type

内容数据类型。在未指定的情况下,若 json 不是None则默认为“application/json”,否则则默认为“application/octet-stream”。 该参数仅在POST和PUT请求时才会用到。

timeout

请求的超时等待时间。

result

返回结果处理方式。若是“bytes”,返回请求结果的裸数据(raw bytes)。 若是“text”,将返回结果以UTF-8解码并返回Unicode字符串。 若是“json”,将结果解码并返回为Json对象。(结果过程中可能会产生其他异常。)

该函数可以在某次交互行为内调用,也可以在交互之外调用。

  • 交互之外调用时,当请求超过 timeout 超时时间依然未得到返回结果,将会反复调用 renpy.pause()(0),因此Ren’Py不会上锁(lock up)。 最好展示一个界面,让用户了解情况。

  • 交互行为内调用时(例如某个行为Action),调用该函数会阻塞后续内容展示,直到网络请求完成或超时。 但该函数会保持音频系统依然运行,保持播放。

该函数可以在所有平台运行。但在Web平台上,非本地的网络请求需要通过CORS的允许。

网络请求 link

在电脑和手机端,Ren’Py包含了 Requests 库。 requests库功能更强大,但未良好集成 renpy.fetch 。 (例如,Ren’Py会调用 renpy.pause() 等待返回数据,而requests库会阻塞进程,导致音频功能也停止。)