あなたの世界を作りなさい
マルチプレイ
マルチプレイサーバーからのHTTPリクエスト
14min
zepeto world multiplayサーバーからhttpリクエストを行うには、zepeto multiplay httpserviceモジュールを使用します。外部ウェブサービスをビジネスロジックの操作、データストレージ、統計分析、エラートラッキングなどに統合してください。 httpsプロトコルのみを使用することを確認してください。httpは開発環境でのみサポートされています。 リクエストはポート80および443でのみ許可されます。 リクエストおよびレスポンスボディの最大サイズは16kbに制限されています。 過剰なリクエストが発生した場合、世界サービスに制限がかかる可能性があるため、1分あたりのリクエスト数を500未満に保ってください。 外部ウェブサービスが5秒以内に応答しない場合、リクエストは失敗します。 レスポンスヘッダーのcontent typeが、 httpcontenttype 列挙型で定義された値と一致することを確認してください。そうでない場合、リクエストは失敗します。 さまざまな理由でウェブリクエストが失敗する可能性があるため、防御的にコーディングすることをお勧めします。 zepeto multiplay httpservice 📘 次のガイドを参照してください。 \[ zepeto multiplay httpservice api https //developer zepeto me/docs/multiplay server/interfaces/zepeto multiplay httpservice httpservice ] メソッド 方法 説明 httpservice getasync(url string, headers? httpheader) promise http getリクエストを非同期に実行します。 \[パラメータ] \ url リクエストを送信するウェブアドレス。 \ headers httpリクエストヘッダー。(オプション) \[戻り値] \ promise\<httpresponse> 応答に関する情報を含むhttpresponseオブジェクトをpromiseとして返します。 httpservice postasync(url string, body httpbodytype, headers? httpheader) promise http postリクエストを非同期に実行します。 \[パラメータ] \ url リクエストを送信するウェブアドレス。 \ body リクエストボディの内容。 \ headers httpリクエストヘッダー。(オプション) \[戻り値] \ promise\<httpresponse> 応答に関する情報を含むhttpresponseオブジェクトをpromiseとして返します。 httpservice postasync(url string, body httpbodytype, httpcontenttype httpcontenttype, headers? httpheader) promise http postリクエストを非同期に実行します。 \[パラメータ] \ url リクエストを送信するウェブアドレス。 \ body リクエストボディの内容。 \ httpcontenttype リクエストのcontent typeヘッダーを指定します。 \ headers httpリクエストヘッダー。(オプション) \[戻り値] \ promise\<httpresponse> 応答に関する情報を含むhttpresponseオブジェクトをpromiseとして返します。 このシグネチャを使用する場合、'content type'をヘッダーに追加すると、httpcontenttypeで指定された内容に上書きされます。 その他の宣言 宣言 説明 httpcontenttype httpヘッダーのcontent typeを指定する定数の列挙。 \ applicationjson 'application/json' \ applicationxml 'application/xml' \ applicationurlencoded 'application/x www form urlencoded' \ textplain 'text/plain' \ textxml 'text/xml' httpbodytype httpリクエストボディのコンテンツタイプで、文字列または文字列キーと任意の値を持つオブジェクトのいずれかです。 httpheader httpリクエストヘッダーを定義するためのタイプで、プロパティ値はオブジェクト内の文字列または数値のいずれかです。 httpresponse httpリクエストの結果と応答データに関する情報を含むインターフェース。 \ statuscodehttp 応答のステータスコードを表す数値。通常、200は成功したリクエストを示します。 \ statustexthttp 応答のステータスメッセージを表す文字列。通常、「ok」は成功したリクエストを示します。 \ response http応答ボディデータを含む文字列。 📘 httpステータス https //developer mozilla org/en us/docs/web/http/status https //developer mozilla org/en us/docs/web/http/status コードサンプル 基本的なgetリクエスト シンプルなgetリクエストの例を作成しましょう。 httpservice getasync 新しいクライアントがmultiplay roomに接続すると、外部ウェブサービスにhttpリクエストを送信し、結果をログに記録します。 restcountries com https //restcountries com/ は、さまざまな国に関する情報を提供するオープンapiです。このサービスを使用して、日本の首都を調べます。 multiplayを設定し、次にworld multiplay/index tsを開いて、サーバースクリプトを次のように記述します。 📘 次のガイドを参照してください。 \[ マルチプレイ docid 0rsogfdzraxefyex5jva6 ] import { sandbox, sandboxoptions, sandboxplayer } from "zepeto multiplay"; import { httpservice } from "zepeto multiplay httpservice"; export default class extends sandbox { oncreate(options sandboxoptions) { } onjoin(client sandboxplayer) { this findcapitalcity() } onleave(client sandboxplayer, consented? boolean) { } findcapitalcity() { // make the request to the restcountries api httpservice getasync("https //restcountries com/v3 1/name/japan?fields=capital") // handler for the http response then((httpresponse) => { // parse the json response data from the api (which is nested in http response) let countries = json parse(httpresponse response); console log("日本の首都は "); console log(`${countries\[0] capital}`); }); } } コードの説明: クライアントがマルチプレイルームに接続すると、 onjoin 関数がトリガーされ、 findcapitalcity が呼び出されます。 もし、 getasync がrestcountries apiに成功した場合、 httpresponse オブジェクトにアクセスできます。 then コールバック内で。 apiレスポンスを解析して、 httpresponse response をjson形式からオブジェクトに変換します。 apiレスポンスの構造を参照することで、必要なプロパティにアクセスし、その値を印刷します。 unityエディタでマルチプレイサーバーを実行し、シーンを再生すると、コンソールに次の内容が表示されます。 日本の首都は 東京 防御的コーディングプラクティス 一方、導入の注意事項で述べたように、ウェブリクエストは、ウェブアドレスやapiレスポンス形式の変更など、さまざまな理由で失敗する可能性があります。 これらのリクエストを適切に処理しないと、world playにさまざまな悪影響を及ぼす可能性があるため、特にhttpリクエストを扱う際には防御的にコーディングすることをお勧めします。 以下は、上記のコードにいくつかの防御的コーディング技術を適用する例です。 findcapitalcity() { // restcountries apiへのリクエストを行う httpservice getasync( "https //restcountries com/v3 1/name/japan?fields=capital", { 'accept' httpcontenttype applicationjson }) // httpレスポンスのハンドラー then((httpresponse) => { // apiコールが200(ok)を返したかどうかを確認 if (httpresponse statuscode != 200) { // 200(ok)でない場合は、処理を続けずカスタムエラーを発生させる throw (`apiエラー ${httpresponse statuscode} ${httpresponse statustext}`); } // apiからのjsonレスポンスデータを返す return httpresponse response; }) // apiからのjsonレスポンスデータのハンドラー then((response) => { // jsonレスポンスデータを解析 let countries = json parse(response); // apiレスポンスデータが有効かどうかを確認 if (!array isarray(countries) || !countries length) { // 配列でない場合、または空の場合 // 処理を続けずカスタムエラーを発生させる throw (`apiエラー レスポンスデータが無効です`); } let country = countries\[0]; // 'capital'フィールドが有効かどうかを確認 if (!country capital) { // 'capital'フィールドが存在しない、または空の場合 // 処理を続けずカスタムエラーを発生させる throw (`apiエラー 'capital'フィールドが無効です`); } console log("日本の首都は ") console log(`${country capital}`); }) // getasync呼び出しと'then'句で発生するエラーのハンドラー。 catch((reason) => { console log("apiリクエストエラー"); console log(reason); }); } ここで適用される防御的コーディング技術には、以下が含まれます: 使用する accept ヘッダー: accept ヘッダーは、レスポンスボディの期待されるcontent typeを指定するために使用されます。サーバーによっては、レスポンスのcontent typeは accept ヘッダーに基づいて調整されることがあります。 チェックする httpresponse statuscode httpresponse statuscode プロパティは、リクエストの成功を確認するために使用されます。 jsonデータ構造の検証: json parse を使用して解析されたオブジェクトのデータ構造が期待される構造と一致するか確認します。 プロパティの存在確認:使用する予定のプロパティがオブジェクトに実際に存在することを確認します。 promiseの catch メソッドを利用する:promiseの catch メソッドは、apiリクエストやレスポンス処理中に発生する可能性のあるエラーを処理するために使用されます。 これらの技術は、予期しないエラーに直面してもコードが信頼性を持って動作するように保護し、その堅牢性を高めます。 クライアントとの統合:ルームメッセージを介して httpリクエストは、multiplayサーバーからのみ可能です。 しかし、multiplayルームメッセージを使用することで、クライアントから外部ウェブサービスにhttpリクエストを送信するようサーバーをトリガーし、クライアント内でその応答を利用することができます。 以下の例は、クライアントとサーバーの統合を示しています。このデモでは、クライアントのui上のボタンが押されると、そのボタンに対応する国の首都が表示されます。 📘 以下のガイドを参照してください。 \[ multiplay room message docid\ p hrmrcyw91bz52ji7w67 ] クライアントコード import { zepetoscriptbehaviour } from 'zepeto script' import { room } from 'zepeto multiplay' import { zepetoworldmultiplay } from 'zepeto world'; import { button, text } from 'unityengine ui' export default class samplescript extends zepetoscriptbehaviour { public multiplay zepetoworldmultiplay; public room room; public countrybuttons button\[]; public capitaltext text; start() { interface response { capitals string\[] } for (const countrybutton of this countrybuttons) { countrybutton onclick addlistener(() => { if (this room !== null) { // 国名を 'client to server' タイプのメッセージとしてサーバーに送信 this room send("client to server", countrybutton getcomponentinchildren\<text>() text); } }); }; this multiplay roomcreated += (room room) => { this room = room; // 'server to client' タイプのメッセージを受信したときの処理 this room addmessagehandler("server to client", (message response) => { // 複数の首都がある国の場合、 // 文字列要素を ', ' で結合してシーンに表示 this capitaltext text = message capitals join(", "); }); }; } } コードの説明: 国名を表示するボタンを反復処理するリスナーを定義します。クリックされると、このリスナーはマルチプレイサーバーにルームメッセージを送信します。 このリスナーは、ボタンに表示されている国名を 'client to server' タイプのメッセージとして送信します。 応答を処理するために、'server to client' タイプのルームメッセージを受信するためのリスナーも定義します。 このリスナーは、サーバーから受信した首都名を画面に表示します。複数の首都がある場合は、画面にカンマで区切って表示されます。 サーバーコード import { sandbox, sandboxoptions, sandboxplayer } from "zepeto multiplay"; import { httpservice } from "zepeto multiplay httpservice"; export default class extends sandbox { oncreate(options sandboxoptions) { // 'client to server'タイプのメッセージを受信したときの処理 this onmessage("client to server", (client, message) => { console log(`クライアント ${client userid} がリクエストを送信しました。メッセージ ${message}`); this findcapitalcity(message, client); }); } onjoin(client sandboxplayer) { } onleave(client sandboxplayer, consented? boolean) { } findcapitalcity(countryname string, client sandboxplayer) { // countrynameをパスパラメータとしてapiにリクエスト // countrynameはクライアントからルームメッセージとして送信される httpservice getasync(`https //restcountries com/v3 1/name/${countryname}?fields=capital`) then((httpresponse) => { if (httpresponse statuscode != 200) { throw (`apiエラー ${httpresponse statuscode} ${httpresponse statustext}`); } return httpresponse response; }) then((response) => { let countries = json parse(response); if (!array isarray(countries) || !countries length) { throw (`apiエラー レスポンスデータが無効です`); } let country = countries\[0]; if (!country capital) { throw (`apiエラー 'capital'フィールドが無効です`); } // クライアントに'server to client'タイプのメッセージを送信 // メッセージは首都名を含むオブジェクトです client send("server to client", { "capitals" country capital }); }) catch((reason) => { console log("apiリクエストエラー"); console log(reason); }); } } コードの説明 クライアントからサーバーへのタイプのマルチプレイルームメッセージを受信したときに呼び出すリスナーを定義します。 findcapitalcity 。 国名を使用してマルチプレイルームメッセージのアドレスを構築し、 getasync 呼び出しを行います。 呼び出しが成功した場合、応答は以前の例と同様に処理されます。 restcountries apiの応答から取得した首都名は、サーバーからクライアントへのタイプのルームメッセージとしてクライアントに送信されます。 postリクエスト 最後に、 httpservice postasync を使用してpostリクエストの例を作成しましょう。 postman echo https //postman echo com/ は、ウェブリクエストから受信したコンテンツを示す構造化された応答を提供するサービスであり、クライアントがリクエストを正しく構成しているかを確認するのに効果的です。 この例を通じて、クエリパラメータ、リクエストボディ、およびヘッダーを持つpostリクエストを設定し、リクエストが適切に構成されていることを確認します。 multiplayを設定し、次にworld multiplay/index tsを開いて、サーバースクリプトを以下のように記述します。 import { sandbox, sandboxoptions, sandboxplayer } from "zepeto multiplay"; import { httpcontenttype, httpservice } from "zepeto multiplay httpservice"; export default class extends sandbox { oncreate(options sandboxoptions) { } onjoin(client sandboxplayer) { this echopost() } onleave(client sandboxplayer, consented? boolean) { } echopost() { httpservice postasync( // apiエンドポイントとクエリパラメータ "https //postman echo com/post?argkey=argvalue", // jsonリクエストボディ { "datakey" "datavalue" }, // リクエストコンテンツタイプ httpcontenttype applicationjson, // httpヘッダー { "header key" "header value" }) then((httpresponse) => { if (httpresponse statuscode != 200) { throw (`apiエラー ${httpresponse statuscode} ${httpresponse statustext}`); } return httpresponse response; }) then((response) => { let parsed = json parse(response); console log(`クエリパラメータ argkey ${parsed args argkey}`); console log(`リクエストボディ datakey ${parsed data datakey}`); console log(`リクエストヘッダー header key ${parsed headers\["header key"]}`) }) catch((reason) => { console log("apiリクエストエラー"); console log(reason); }); } } コードの説明: クライアントがマルチプレイルームに接続すると、 echopost 関数が onjoin トリガーから呼び出されます。 次の postasync リクエストを作成する際: 最初のパラメータでは、クエリパラメータを含むurl文字列を構築します。 2番目のパラメータでは、リクエストボディの内容を設定します。 4番目のパラメータでは、リクエストヘッダーを設定します。 リクエストボディがjson形式であることを指定するために、3番目のパラメータに'application/json' content typeを設定します。 もし postasync 呼び出しが成功した場合、 httpresponse オブジェクトにアクセスできます。 その後 コールバック。 私たちは httpresponse response を解析して、apiのレスポンスをjson形式からオブジェクトに変換します。 apiレスポンスの構造を参照し、コンソール出力を使用して、httpリクエストのクエリパラメータ、リクエストボディ、およびリクエストヘッダーが正しく設定されているかを確認します。 unityエディタでmultiplayサーバーを実行し、シーンを再生すると、コンソールに以下が表示されます。 クエリパラメータ argkey\ argvalue リクエストボディ datakey\ datavalue リクエストヘッダー header key\ header value