HTTPリクエストを行う

HTTPRequest ノードは、GodotでHTTPリクエストを行う最も簡単な方法です。これは、より低レベルの HTTPClient に支えられており、チュートリアルについては これ を使用できます。

この例のために、ボタンが付いたシンプルなUIを作成します。ボタンを押すと、指定されたURLへのHTTPリクエストが開始されます。

シーンの準備

新しい空のシーンを作成し、CanvasLayerをルートノードとして追加し、スクリプトを追加します。次に、2つの子ノード、ButtonおよびHTTPRequestノードを追加します。次のシグナルをCanvasLayerスクリプトに接続する必要があります:

  • Button.pressed:ボタンを押すと、要求が開始されます。
  • HTTPRequest.request_completed: 要求が完了すると、要求されたデータが引数として取得されます。
../../_images/rest_api_scene.png

スクリプト

以下は、それを動作させるために必要なすべてのコードです。URLはオンラインAPIモッカーを指します。定義済みのJSON文字列を返し、データにアクセスするために解析します。

extends CanvasLayer

func _ready():
    $HTTPRequest.connect("request_completed", self, "_on_request_completed")

func _on_Button_pressed():
    $HTTPRequest.request("http://www.mocky.io/v2/5185415ba171ea3a00704eed")

func _on_request_completed(result, response_code, headers, body):
    var json = JSON.parse(body.get_string_from_utf8())
    print(json.result)

これにより、コンソールに (hello:world) が表示されます。helloがキーであり、worldが値であり、どちらも文字列です。

JSONの解析の詳細については、: ref:JSON <class_JSON> および JSONParseResult のクラスリファレンスを参照してください。

resultRESULT_SUCCESS に等しいかどうか、およびJSON解析エラーが発生したかどうかを確認したい場合があることに注意してください。詳細については、JSONクラスリファレンスと HTTPRequest を参照してください。

もちろん、カスタムHTTPヘッダーを設定することもできます。これらは文字列配列として与えられ、各文字列には "header:value" 形式のヘッダーが含まれます。たとえば、カスタムユーザーエージェント(HTTP user-agent ヘッダー)を設定するには、次を使用できます:

$HTTPRequest.request("http://www.mocky.io/v2/5185415ba171ea3a00704eed", ["user-agent: YourCustomUserAgent"])

SSL/TLS暗号化とHTTPS URLが機能するためには、こちら で説明されている手順を実行する必要がある場合があることに注意してください。

また、承認を使用してAPIを呼び出す場合、リリースされたアプリケーションを分析および逆コンパイルし、トークン、ユーザー名、パスワードなどの埋め込み承認情報にアクセスする可能性があることに注意してください。つまり、通常、ゲーム内にデータベースアクセスの資格情報などを埋め込むことはお勧めできません。可能な限り、攻撃者にとって有用な情報を提供しないでください。

サーバーへのデータの送信

これまで、サーバーからのデータのリクエストに限定してきました。しかし、サーバーにデータを送信する必要がある場合はどうでしょうか?一般的な方法は次のとおりです:

func _make_post_request(url, data_to_send, use_ssl):
    # Convert data to json string:
    var query = JSON.print(data_to_send)
    # Add 'Content-Type' header:
    var headers = ["Content-Type: application/json"]
    $HTTPRequest.request(url, headers, use_ssl, HTTPClient.METHOD_POST, query)

リクエストが完了するのを待ってから、別のリクエストを送信する必要があることに注意してください。一度に複数の要求を行うには、要求ごとに1つのノードが必要です。一般的な戦略は、必要に応じて実行時にHTTPRequestノードを作成および削除することです。