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庫會阻塞進程,導致音訊功能也停止。)