สร้างโลกของคุณเอง
มัลติเพลย์

HTTP request จากเซิร์ฟเวอร์ Multiplay

15นาที
คุณสามารถทำการร้องขอ http จากเซิร์ฟเวอร์ zepeto world multiplay โดยใช้โมดูล zepeto multiplay httpservice รวมบริการเว็บภายนอกเข้ากับการดำเนินงานด้านตรรกะธุรกิจ การจัดเก็บข้อมูล การวิเคราะห์ทางสถิติ การติดตามข้อผิดพลาด และอื่นๆ โปรดตรวจสอบให้แน่ใจว่าใช้โปรโตคอล https เท่านั้น ขณะที่ http รองรับเฉพาะในสภาพแวดล้อมการพัฒนา อนุญาตให้ทำการร้องขอเฉพาะที่พอร์ต 80 และ 443 เท่านั้น ขนาดสูงสุดสำหรับเนื้อหาของการร้องขอและการตอบสนองถูกจำกัดที่ 16kb ให้รักษาจำนวนการร้องขอต่อหนึ่งนาทีไม่เกิน 500 เพื่อหลีกเลี่ยงข้อจำกัดที่อาจเกิดขึ้นกับบริการโลกหากมีการร้องขอมากเกินไป การร้องขอจะล้มเหลวหากบริการเว็บภายนอกไม่ตอบสนองภายใน 5 วินาที ตรวจสอบให้แน่ใจว่าประเภทเนื้อหาในส่วนหัวการตอบสนองตรงกับค่าที่กำหนดใน httpcontenttype enum; มิฉะนั้น การร้องขอจะล้มเหลว เนื่องจากมีความเป็นไปได้ที่การร้องขอเว็บจะล้มเหลวด้วยเหตุผลต่างๆ จึงแนะนำให้เขียนโค้ดอย่างระมัดระวัง 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' ใน headers มันจะถูกเขียนทับโดยสิ่งที่ระบุใน httpcontenttype การประกาศอื่น ๆ การประกาศ คำอธิบาย httpcontenttype การระบุประเภทเนื้อหาสำหรับ http headers \ applicationjson 'application/json' \ applicationxml 'application/xml' \ applicationurlencoded 'application/x www form urlencoded' \ textplain 'text/plain' \ textxml 'text/xml' httpbodytype ประเภทสำหรับเนื้อหาของ http request body ซึ่งสามารถเป็นได้ทั้งสตริงหรือวัตถุที่มีคีย์เป็นสตริงและค่าที่เป็นอะไรก็ได้ httpheader ประเภทสำหรับการกำหนด http request headers โดยที่ค่าของคุณสมบัติสามารถเป็นได้ทั้งสตริงหรือหมายเลขในวัตถุ httpresponse อินเตอร์เฟซที่รวมข้อมูลเกี่ยวกับผลลัพธ์ของ http request และข้อมูลการตอบกลับ \ 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 เราจะส่งคำขอ http ไปยังบริการเว็บภายนอกและบันทึกผลลัพธ์ restcountries com https //restcountries com/ เป็น api แบบเปิดที่ให้ข้อมูลเกี่ยวกับประเทศต่างๆ เราจะใช้บริการนี้เพื่อตรวจสอบเมืองหลวงของญี่ปุ่น ตั้งค่า multiplay จากนั้นเปิด world multiplay/index ts และเขียนสคริปต์เซิร์ฟเวอร์ดังนี้ 📘 โปรดดูคู่มือต่อไปนี้ \[ มัลติเพลย์ docid kqgjbfq 6znt awbmnac ] 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}`); }); } } คำอธิบายโค้ด เมื่อไคลเอนต์เชื่อมต่อกับห้อง multiplay ฟังก์ชัน onjoin จะถูกเรียกใช้งาน และมันจะเรียก findcapitalcity ถ้า getasync เรียกไปยัง api restcountries สำเร็จ คุณสามารถเข้าถึง httpresponse อ็อบเจ็กต์ใน then คอลแบ็ก แปลง httpresponse response เพื่อแปลงการตอบสนองจาก api ซึ่งอยู่ในรูปแบบ json ให้เป็นอ็อบเจ็กต์ โดยการอ้างอิงถึงโครงสร้างของการตอบสนองจาก api คุณสามารถเข้าถึงคุณสมบัติที่ต้องการและพิมพ์ค่าของพวกเขาได้ เมื่อคุณเรียกใช้เซิร์ฟเวอร์ multiplay ใน unity editor และเล่นฉาก ข้อความต่อไปนี้จะถูกแสดงใน console เมืองหลวงของญี่ปุ่นคือ โตเกียว แนวทางการเขียนโค้ดที่ปลอดภัย ในขณะเดียวกัน ตามที่ได้กล่าวไว้ในข้อควรระวังเบื้องต้น การร้องขอเว็บอาจล้มเหลวได้จากหลายสาเหตุ รวมถึงการเปลี่ยนแปลงในที่อยู่เว็บหรือรูปแบบการตอบสนองของ api การจัดการคำขอเหล่านี้อย่างไม่เหมาะสมอาจมีผลกระทบที่ไม่พึงประสงค์ต่อการเล่นโลก ดังนั้นจึงแนะนำให้เขียนโค้ดอย่างปลอดภัย โดยเฉพาะเมื่อจัดการกับคำขอ http ต่อไปนี้คือตัวอย่างการใช้เทคนิคการเขียนโค้ดที่ปลอดภัยหลายอย่างกับโค้ดด้านบน findcapitalcity() { // ทำการร้องขอไปยัง api restcountries 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 error ${httpresponse statuscode} ${httpresponse statustext}`); } // คืนค่าข้อมูลการตอบสนอง json จาก api return httpresponse response; }) // ตัวจัดการสำหรับข้อมูลการตอบสนอง json จาก api then((response) => { // แยกข้อมูลการตอบสนอง json let countries = json parse(response); // ตรวจสอบว่าข้อมูลการตอบสนอง api ถูกต้องหรือไม่ if (!array isarray(countries) || !countries length) { // หากไม่ใช่ array หรือว่างเปล่า // ให้หยุดและสร้างข้อผิดพลาดที่กำหนดเอง throw (`api error response data is not valid`); } let country = countries\[0]; // ตรวจสอบว่าฟิลด์ 'capital' ถูกต้องหรือไม่ if (!country capital) { // หากฟิลด์ 'capital' ไม่มีอยู่ หรือว่างเปล่า // ให้หยุดและสร้างข้อผิดพลาดที่กำหนดเอง throw (`api error 'capital' field not valid`); } console log("เมืองหลวงของญี่ปุ่นคือ ") console log(`${country capital}`); }) // ตัวจัดการสำหรับข้อผิดพลาดที่เกิดขึ้นในคำขอ getasync และคลอส 'then' catch((reason) => { console log("ข้อผิดพลาดในการร้องขอ api"); console log(reason); }); } เทคนิคการเขียนโค้ดเชิงป้องกันที่ใช้ที่นี่รวมถึงสิ่งต่อไปนี้ การใช้ accept header accept header ใช้เพื่อระบุ content type ที่คาดหวังสำหรับเนื้อหาของการตอบกลับ ขึ้นอยู่กับเซิร์ฟเวอร์ content type ของการตอบกลับสามารถปรับได้ตาม accept header การตรวจสอบ httpresponse statuscode httpresponse statuscode คุณสมบัติใช้เพื่อยืนยันความสำเร็จของคำขอ การตรวจสอบโครงสร้างข้อมูล json คุณยืนยันว่าโครงสร้างข้อมูลของวัตถุที่แยกวิเคราะห์ด้วย json parse ตรงกับโครงสร้างที่คาดหวัง การตรวจสอบการมีอยู่ของคุณสมบัติ คุณมั่นใจว่าคุณสมบัติที่คุณตั้งใจจะใช้มีอยู่จริงในวัตถุ การใช้ catch ของ promise catch วิธีการของ promise ใช้เพื่อจัดการข้อผิดพลาดที่อาจเกิดขึ้นระหว่างการร้องขอ api และการประมวลผลการตอบกลับ เทคนิคเหล่านี้ช่วยปกป้องโค้ดให้ทำงานได้อย่างเชื่อถือได้เมื่อเผชิญกับข้อผิดพลาดที่ไม่คาดคิด เพิ่มความแข็งแกร่งให้กับมัน การรวมเข้ากับลูกค้าผ่านข้อความในห้อง คำขอ http สามารถทำได้จากเซิร์ฟเวอร์ multiplay เท่านั้น อย่างไรก็ตาม โดยการใช้ข้อความในห้อง multiplay คุณสามารถกระตุ้นให้เซิร์ฟเวอร์ส่งคำขอ http ไปยังบริการเว็บภายนอกจากลูกค้าและใช้การตอบสนองภายในลูกค้าได้ ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการรวมเข้ากับลูกค้าและเซิร์ฟเวอร์ ในการสาธิตนี้ เมื่อปุ่มบน ui ของลูกค้าถูกกด เมืองหลวงของประเทศที่ตรงกับปุ่มจะแสดงขึ้น 📘 กรุณาอ้างอิงจากคู่มือต่อไปนี้ \[ ข้อความในห้องเล่นหลายคน docid 80px4fctallbpg9v1pncx ] รหัสลูกค้า 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(", "); }); }; } } คำอธิบายโค้ด เรากำหนดผู้ฟังที่วนรอบปุ่มที่แสดงชื่อประเทศ เมื่อคลิก ผู้ฟังนี้จะส่งข้อความ room ไปยังเซิร์ฟเวอร์ multiplay ผู้ฟังนี้ส่งชื่อประเทศที่แสดงบนปุ่มเป็นข้อความประเภท 'client to server' เพื่อจัดการกับการตอบสนอง เรากำหนดผู้ฟังสำหรับการประมวลผลข้อความ room ที่ได้รับเป็นประเภท '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 ${client userid} ส่งคำขอ ข้อความ ${message}`); this findcapitalcity(message, client); }); } onjoin(client sandboxplayer) { } onleave(client sandboxplayer, consented? boolean) { } findcapitalcity(countryname string, client sandboxplayer) { // ขอ api โดยใช้ countryname เป็นพารามิเตอร์ในเส้นทาง // countryname ถูกส่งโดยไคลเอนต์เป็นข้อความในห้อง httpservice getasync(`https //restcountries com/v3 1/name/${countryname}?fields=capital`) then((httpresponse) => { if (httpresponse statuscode != 200) { throw (`api error ${httpresponse statuscode} ${httpresponse statustext}`); } return httpresponse response; }) then((response) => { let countries = json parse(response); if (!array isarray(countries) || !countries length) { throw (`api error ข้อมูลการตอบกลับไม่ถูกต้อง`); } let country = countries\[0]; if (!country capital) { throw (`api error ฟิลด์ 'capital' ไม่ถูกต้อง`); } // ส่งข้อความประเภท 'server to client' ไปยังไคลเอนต์ // ข้อความเป็นวัตถุที่มีชื่อเมืองหลวง client send("server to client", { "capitals" country capital }); }) catch((reason) => { console log("ข้อผิดพลาดในการขอ api"); console log(reason); }); } } คำอธิบายโค้ด เรากำหนดผู้ฟังที่เมื่อได้รับข้อความ multiplay room ประเภท 'client to server' จะเรียก findcapitalcity เราสร้างที่อยู่สำหรับข้อความ multiplay room โดยใช้ชื่อประเทศและทำการ getasync เรียก หากการ getasync เรียกสำเร็จ การตอบสนองจะถูกจัดการตามตัวอย่างก่อนหน้า ชื่อเมืองหลวงที่ได้รับจากการตอบสนองของ api restcountries จะถูกส่งไปยังลูกค้าในฐานะข้อความ room ประเภท 'server to client' คำขอ post สุดท้ายนี้ มาสร้างตัวอย่างคำขอ post โดยใช้ httpservice postasync 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 endpoint with a query parameter "https //postman echo com/post?argkey=argvalue", // json request body { "datakey" "datavalue" }, // request content type httpcontenttype applicationjson, // http header { "header key" "header value" }) then((httpresponse) => { if (httpresponse statuscode != 200) { throw (`api error ${httpresponse statuscode} ${httpresponse statustext}`); } return httpresponse response; }) then((response) => { let parsed = json parse(response); console log(`query parameter argkey ${parsed args argkey}`); console log(`request body datakey ${parsed data datakey}`); console log(`request header header key ${parsed headers\["header key"]}`) }) catch((reason) => { console log("api request error"); console log(reason); }); } } คำอธิบายโค้ด เมื่อไคลเอนต์เชื่อมต่อกับห้อง multiplay, echopost ฟังก์ชันจะถูกเรียกจาก onjoin ทริกเกอร์ เมื่อทำการ postasync คำขอ ในพารามิเตอร์แรก, เราสร้างสตริง url พร้อมพารามิเตอร์การค้นหา ในพารามิเตอร์ที่สอง, เราตั้งค่าคอนเทนต์ของร่างคำขอ ในพารามิเตอร์ที่สี่, เรากำหนดค่าหัวข้อคำขอ เพื่อระบุว่าร่างคำขออยู่ในรูปแบบ json, เราตั้งค่า 'application/json' content type ในพารามิเตอร์ที่สาม หากการเรียก postasync สำเร็จ, เราสามารถเข้าถึง httpresponse อ็อบเจ็กต์ใน then คอลแบ็ก เราวิเคราะห์ httpresponse response เพื่อแปลงการตอบสนอง api ในรูปแบบ json เป็นอ็อบเจ็กต์ อ้างอิงจากโครงสร้างของการตอบสนอง api, เราใช้ console output เพื่อตรวจสอบว่าพารามิเตอร์การค้นหา, ร่างคำขอ, และหัวข้อคำขอของ http ของเราถูกกำหนดค่าอย่างถูกต้องหรือไม่ เมื่อคุณเรียกใช้เซิร์ฟเวอร์ multiplay ใน unity editor และเล่นฉาก ข้อความต่อไปนี้จะปรากฏใน console พารามิเตอร์การค้นหา argkey\ argvalue เนื้อหาคำขอ datakey\ datavalue ส่วนหัวคำขอ header key\ header value