CRÉEZ VOTRE MONDE
Multiplay
Requête HTTP du serveur Multiplay
16min
vous pouvez effectuer des requêtes http depuis le serveur multiplay de zepeto en utilisant le module zepeto multiplay httpservice intégrez des services web externes dans vos opérations de logique métier, stockage de données, analyse statistique, suivi des erreurs, et plus encore veuillez vous assurer que seul le protocole https est utilisé, tandis que http n'est pris en charge que dans l'environnement de développement les requêtes ne sont autorisées que sur les ports 80 et 443 la taille maximale des corps de requête et de réponse est limitée à 16 ko gardez le nombre de requêtes par minute en dessous de 500 pour éviter d'éventuelles limitations sur le service mondial en cas de requêtes excessives les requêtes échoueront si les services web externes ne répondent pas dans les 5 secondes assurez vous que le type de contenu dans les en têtes de réponse correspond aux valeurs définies dans le httpcontenttype enum ; sinon, les requêtes échoueront étant donné la possibilité que les requêtes web échouent pour diverses raisons, il est recommandé de coder de manière défensive zepeto multiplay httpservice 📘 veuillez vous référer au guide suivant \[ api zepeto multiplay httpservice https //developer zepeto me/docs/multiplay server/interfaces/zepeto multiplay httpservice httpservice ] méthodes méthode description httpservice getasync(url string, headers? httpheader) promise effectuer des requêtes http get de manière asynchrone \[paramètres] \ url l'adresse web à laquelle envoyer la requête \ headers en têtes de requête http (optionnel) \[valeur de retour] \ promise\<httpresponse> renvoie un objet httpresponse contenant des informations sur la réponse sous forme de promise httpservice postasync(url string, body httpbodytype, headers? httpheader) promise effectuer des requêtes http post de manière asynchrone \[paramètres] \ url l'adresse web à laquelle envoyer la requête \ body le contenu du corps de la requête \ headers en têtes de requête http (optionnel) \[valeur de retour] \ promise\<httpresponse> renvoie un objet httpresponse contenant des informations sur la réponse sous forme de promise httpservice postasync(url string, body httpbodytype, httpcontenttype httpcontenttype, headers? httpheader) promise effectuer des requêtes http post de manière asynchrone \[paramètres] \ url l'adresse web à laquelle envoyer la requête \ body le contenu du corps de la requête \ httpcontenttype spécifie l'en tête content type de la requête \ headers en têtes de requête http (optionnel) \[valeur de retour] \ promise\<httpresponse> renvoie un objet httpresponse contenant des informations sur la réponse sous forme de promise lorsque vous utilisez cette signature, si vous ajoutez 'content type' aux en têtes, il sera écrasé par ce qui est spécifié dans httpcontenttype autres déclarations déclaration description httpcontenttype énumération de constantes qui spécifient le content type pour les en têtes http \ applicationjson 'application/json' \ applicationxml 'application/xml' \ applicationurlencoded 'application/x www form urlencoded' \ textplain 'text/plain' \ textxml 'text/xml' httpbodytype type pour le contenu du corps de la requête http, qui peut être soit une chaîne, soit un objet avec des clés de chaîne et des valeurs quelconques httpheader type pour définir les en têtes de requête http, où les valeurs des propriétés peuvent être soit des chaînes, soit des nombres dans l'objet httpresponse interface qui inclut des informations sur le résultat de la requête http et les données de réponse \ statuscodehttp un nombre représentant le code d'état de la réponse en général, 200 indique une requête réussie \ statustexthttp une chaîne représentant le message d'état de la réponse en général, "ok" indique une requête réussie \ response une chaîne contenant les données du corps de la réponse http 📘 statut http https //developer mozilla org/en us/docs/web/http/status https //developer mozilla org/en us/docs/web/http/status exemples de code requête get de base créons un exemple simple de requête get en utilisant httpservice getasync lorsqu'un nouveau client se connecte à la salle multiplay, nous enverrons une requête http à un service web externe et enregistrerons le résultat restcountries com https //restcountries com/ est une api ouverte qui fournit des informations sur divers pays nous utiliserons ce service pour découvrir la capitale du japon configurez multiplay, puis ouvrez world multiplay/index ts et écrivez le script du serveur comme suit 📘 veuillez vous référer au guide suivant \[ multiplay docid\ qoqco4ojnwlll4um8zmzd ] 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() { // faire la requête à l'api restcountries httpservice getasync("https //restcountries com/v3 1/name/japan?fields=capital") // gestionnaire pour la réponse http then((httpresponse) => { // analyser les données de réponse json de l'api (qui sont imbriquées dans la réponse http) let countries = json parse(httpresponse response); console log("la capitale du japon est "); console log(`${countries\[0] capital}`); }); } } description du code lorsqu'un client se connecte à la salle multiplay, la onjoin fonction est déclenchée, et elle appelle findcapitalcity si l' getasync appel à l'api restcountries est réussi, vous pouvez accéder à l' httpresponse objet dans le then rappel analyser httpresponse response pour convertir la réponse de l'api, qui est au format json, en un objet en vous référant à la structure de la réponse de l'api, vous accédez aux propriétés souhaitées et imprimez ensuite leurs valeurs lorsque vous exécutez le serveur multiplay dans l'éditeur unity et jouez la scène, les éléments suivants seront affichés dans la console la ville capitale du japon est tokyo pratiques de codage défensif en attendant, comme mentionné dans les précautions introductives, les requêtes web peuvent échouer pour diverses raisons, y compris des changements d'adresses web ou de formats de réponse api le fait de ne pas gérer correctement ces requêtes peut avoir divers effets néfastes sur le jeu mondial, il est donc recommandé de coder de manière défensive, surtout lors de la gestion des requêtes http voici un exemple d'application de plusieurs techniques de codage défensif au code ci dessus findcapitalcity() { // faire la requête à l'api restcountries httpservice getasync( "https //restcountries com/v3 1/name/japan?fields=capital", { 'accept' httpcontenttype applicationjson }) // gestionnaire pour la réponse http then((httpresponse) => { // vérifier si l'appel api a retourné 200(ok) ou non if (httpresponse statuscode != 200) { // si ce n'était pas 200(ok), ne pas continuer et lever une erreur personnalisée throw (`erreur api ${httpresponse statuscode} ${httpresponse statustext}`); } // retourner les données de réponse json de l'api return httpresponse response; }) // gestionnaire pour les données de réponse json de l'api then((response) => { // analyser les données de réponse json let countries = json parse(response); // vérifier si les données de réponse api sont valides if (!array isarray(countries) || !countries length) { // si ce n'est pas un tableau, ou est vide // ne pas continuer et lever une erreur personnalisée throw (`erreur api les données de réponse ne sont pas valides`); } let country = countries\[0]; // vérifier si le champ 'capital' est valide if (!country capital) { // si le champ 'capital' n'existe pas, ou est vide // ne pas continuer et lever une erreur personnalisée throw (`erreur api champ 'capital' non valide`); } console log("la ville capitale du japon est ") console log(`${country capital}`); }) // gestionnaire pour les erreurs survenant dans l'appel getasync et les clauses 'then' catch((reason) => { console log("erreur de requête api"); console log(reason); }); } les techniques de codage défensif appliquées ici incluent les suivantes utiliser l' accept en tête l' accept en tête est utilisé pour spécifier le content type attendu pour le corps de la réponse selon le serveur, le content type de la réponse peut être ajusté en fonction de l' accept en tête vérification de httpresponse statuscode la httpresponse statuscode propriété est utilisée pour vérifier le succès de la requête validation de la structure des données json vous confirmez si la structure des données de l'objet analysé avec json parse correspond à la structure attendue vérification de l'existence des propriétés vous vous assurez que les propriétés que vous avez l'intention d'utiliser existent réellement dans l'objet utilisation de la méthode catch de la promesse la catch méthode de la promesse est utilisée pour gérer les erreurs qui peuvent survenir lors des requêtes api et du traitement des réponses ces techniques protègent le code pour fonctionner de manière fiable face à des erreurs inattendues, renforçant ainsi sa robustesse intégration avec les clients via les messages de salle les requêtes http ne sont possibles que depuis le serveur multiplay cependant, en utilisant les messages de salle multiplay, vous pouvez déclencher le serveur pour envoyer des requêtes http à des services web externes depuis le client et utiliser les réponses au sein du client l'exemple suivant démontre l'intégration client serveur dans cette démonstration, lorsque un bouton de l'interface utilisateur du client est pressé, la capitale du pays correspondant au bouton est affichée 📘 veuillez vous référer au guide suivant \[ message de la salle multiplay docid\ m0wk142xsx834bmxmuem9 ] code client 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) { // envoyer le nom du pays en tant que message de type 'client à serveur' au serveur this room send("client to server", countrybutton getcomponentinchildren\<text>() text); } }); }; this multiplay roomcreated += (room room) => { this room = room; // gérer les messages reçus avec un type 'serveur à client' this room addmessagehandler("server to client", (message response) => { // pour les pays avec plusieurs capitales, // joindre les éléments de chaîne avec ', ' et afficher sur la scène this capitaltext text = message capitals join(", "); }); }; } } description du code nous définissons un écouteur qui itère à travers les boutons affichant les noms des pays lorsqu'il est cliqué, cet écouteur envoie un message de salle au serveur multiplay cet écouteur envoie le nom du pays affiché sur le bouton en tant que message de type 'client à serveur' pour gérer les réponses, nous définissons également un écouteur pour traiter les messages de salle reçus en tant que type 'serveur à client' cet écouteur affiche le nom de la capitale reçu du serveur à l'écran s'il y a plusieurs capitales, elles sont affichées à l'écran, séparées par des virgules code serveur import { sandbox, sandboxoptions, sandboxplayer } from "zepeto multiplay"; import { httpservice } from "zepeto multiplay httpservice"; export default class extends sandbox { oncreate(options sandboxoptions) { // gérer les messages reçus avec un type 'client to server' this onmessage("client to server", (client, message) => { console log(`client ${client userid} a envoyé une demande message ${message}`); this findcapitalcity(message, client); }); } onjoin(client sandboxplayer) { } onleave(client sandboxplayer, consented? boolean) { } findcapitalcity(countryname string, client sandboxplayer) { // demander à l'api avec le countryname comme paramètre de chemin // le countryname est envoyé par le client comme message de salle httpservice getasync(`https //restcountries com/v3 1/name/${countryname}?fields=capital`) then((httpresponse) => { if (httpresponse statuscode != 200) { throw (`erreur api ${httpresponse statuscode} ${httpresponse statustext}`); } return httpresponse response; }) then((response) => { let countries = json parse(response); if (!array isarray(countries) || !countries length) { throw (`erreur api les données de réponse ne sont pas valides`); } let country = countries\[0]; if (!country capital) { throw (`erreur api le champ 'capital' n'est pas valide`); } // envoyer un message de type 'server to client' au client // le message est un objet contenant les noms des capitales client send("server to client", { "capitals" country capital }); }) catch((reason) => { console log("erreur de demande api"); console log(reason); }); } } description du code nous définissons un écouteur qui, lors de la réception d'un message de salle multiplay de type 'client à serveur', appelle findcapitalcity nous construisons une adresse pour le message de salle multiplay en utilisant le nom du pays et faisons un getasync appel si l' getasync appel est réussi, la réponse est traitée comme dans les exemples précédents le nom de la ville capitale obtenu à partir de la réponse de l'api restcountries est envoyé au client sous forme de message de salle de type 'serveur à client' requête post enfin, créons un exemple de requête post en utilisant httpservice postasync postman echo https //postman echo com/ est un service qui fournit des réponses structurées montrant quel contenu a été reçu des requêtes web, ce qui le rend efficace pour vérifier si le client a correctement configuré la requête à travers cet exemple, nous allons configurer une requête post avec des paramètres de requête, un corps de requête et des en têtes et nous assurer que la requête est correctement configurée configurez multiplay, puis ouvrez world multiplay/index ts et écrivez le script du serveur comme suit 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( // point de terminaison api avec un paramètre de requête "https //postman echo com/post?argkey=argvalue", // corps de la requête json { "datakey" "datavalue" }, // type de contenu de la requête httpcontenttype applicationjson, // en tête http { "header key" "header value" }) then((httpresponse) => { if (httpresponse statuscode != 200) { throw (`erreur api ${httpresponse statuscode} ${httpresponse statustext}`); } return httpresponse response; }) then((response) => { let parsed = json parse(response); console log(`paramètre de requête argkey ${parsed args argkey}`); console log(`corps de la requête datakey ${parsed data datakey}`); console log(`en tête de la requête header key ${parsed headers\["header key"]}`) }) catch((reason) => { console log("erreur de requête api"); console log(reason); }); } } description du code lorsqu'un client se connecte à la salle multiplay, la echopost fonction est appelée depuis le onjoin déclencheur lors de la création de la postasync demande dans le premier paramètre, nous construisons la chaîne d'url avec des paramètres de requête dans le deuxième paramètre, nous définissons le contenu du corps de la requête dans le quatrième paramètre, nous configurons l'en tête de la requête pour spécifier que le corps de la requête est au format json, nous définissons le 'application/json' content type dans le troisième paramètre si l'appel postasync est réussi, nous pouvons accéder à l' httpresponse objet dans le then callback nous analysons httpresponse response pour convertir la réponse de l'api au format json en un objet en nous référant à la structure de la réponse de l'api, nous utilisons la sortie console pour vérifier si les paramètres de requête, le corps de la requête et l'en tête de la requête de notre requête http sont correctement configurés lorsque vous exécutez le serveur multiplay dans l'éditeur unity et que vous jouez la scène, ce qui suit sera affiché dans la console paramètre de requête argkey\ argvalue corps de la requête datakey\ datavalue en tête de la requête header key\ header value