来自Multiplay服务器的HTTP请求
您可以使用 ZEPETO.Multiplay.HttpService 模块从 ZEPETO World Multiplay 服务器发出 HTTP 请求。将外部网络服务集成到您的业务逻辑操作、数据存储、统计分析、错误跟踪等中。
- 请确保仅使用 HTTPS 协议,而 HTTP 仅在开发环境中支持。
- 仅允许在 80 和 443 端口上发出请求。
- 请求和响应主体的最大大小限制为 16KB。
- 每分钟的请求数量应保持在 500 以下,以避免在发生过多请求时对世界服务施加潜在限制。
- 如果外部网络服务在 5 秒内未响应,请求将失败。
- 确保响应头中的内容类型与 HttpContentType 枚举中定义的值匹配;否则,请求将失败。
- 考虑到网络请求可能因各种原因失败,建议采取防御性编码。
📘 请参考以下指南。 [ZEPETO.Multiplay.HttpService API]
方法 | 描述 |
---|---|
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。 使用此签名时,如果您在 headers 中添加 '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响应体数据的字符串。 |
让我们使用 HttpService.getAsync. 当一个新客户端连接到 Multiplay 房间时,我们将向外部网络服务发送一个 HTTP 请求并记录结果。
restcountries.com 是一个开放的API,提供有关各国的信息。我们将使用此服务来查找日本的首都。
设置Multiplay,然后打开World.multiplay/index.ts并按如下方式编写服务器脚本。
📘 请参考以下指南。 [多人游戏]
代码描述:
- 当客户端连接到Multiplay房间时,onJoin函数被触发,并调用findCapitalCity。
- 如果对restcountries API的getAsync调用成功,您可以在httpResponse对象中访问then回调。
- 解析httpResponse.response以将API响应(以JSON格式)转换为对象。
- 通过参考API响应的结构,您可以访问所需的属性,然后打印它们的值。
当您在Unity编辑器中运行Multiplay服务器并播放场景时,控制台将显示以下内容。
- 同时,如引言中的预防措施所提到的,网络请求可能因各种原因而失败,包括网络地址或API响应格式的变化。
- 未能正确处理这些请求可能对世界游戏产生各种不利影响,因此建议进行防御性编码,特别是在处理HTTP请求时。
- 以下是将几种防御性编码技术应用于上述代码的示例。
这里应用的防御性编码技术包括以下内容:
- 使用 Accept 头部:Accept 头部用于指定响应体的预期 Content-Type。根据服务器的不同,响应的 Content-Type 可以根据 Accept 头部进行调整。
- 检查 HttpResponse.statusCode: HttpResponse.statusCode 属性用于验证请求的成功。
- 验证 JSON 数据结构:您确认使用 JSON.parse 解析的对象的数据结构是否与预期结构匹配。
- 验证属性存在性:您确保您打算使用的属性在对象中确实存在。
- 利用 Promise 的 catch 方法:Promise 的 catch 方法用于处理在 API 请求和响应处理过程中可能发生的错误。
这些技术保护代码在面对意外错误时可靠运行,增强了其稳健性。
HTTP 请求仅能从 Multiplay 服务器发出。
然而,通过使用 Multiplay 房间消息,您可以触发服务器从客户端向外部网络服务发送 HTTP 请求,并在客户端中利用响应。
以下示例演示了客户端与服务器的集成。在此演示中,当客户端 UI 上的按钮被按下时,显示与该按钮对应的国家首都。
📘 请参考以下指南。 [[err] ]
客户端代码
代码描述:
- 我们定义了一个监听器,遍历显示国家名称的按钮。当点击时,这个监听器向Multiplay服务器发送一个房间消息。
- 这个监听器将按钮上显示的国家名称作为 '客户端到服务器' 类型消息发送。
- 为了处理响应,我们还定义了一个监听器,用于处理作为 '服务器到客户端' 类型接收的房间消息。
- 这个监听器在屏幕上显示从服务器接收到的首都城市名称。如果有多个首都城市,它们将在屏幕上显示,并用逗号分隔。
服务器代码
代码描述:
- 我们定义一个监听器,当接收到 'client-to-server' 类型的 Multiplay Room Message 时,调用 findCapitalCity。
- 我们使用国家名称构建 Multiplay Room Message 的地址,并进行 getAsync 调用。
- 如果 getAsync 调用成功,响应将像之前的示例一样处理。
- 从 restcountries API 的响应中获得的首都城市名称作为 'server-to-client' 类型的 Room Message 发送给客户端。
最后,让我们使用 HttpService.postAsync.
postman-echo 是一个提供结构化响应的服务,显示从网络请求中接收到的内容,使其有效地验证客户端是否正确配置了请求。
通过这个例子,我们将设置一个带有查询参数、请求体和头部的POST请求,并确保请求配置正确。
设置 Multiplay,然后打开 World.multiplay/index.ts 并按如下方式编写服务器脚本。
代码描述:
- 当客户端连接到Multiplay Room时,echoPost函数从onJoin触发器被调用。
- 在发起postAsync请求时:
- 在第一个参数中,我们构造带有查询参数的URL字符串。
- 在第二个参数中,我们设置请求体内容。
- 在第四个参数中,我们配置请求头。
- 为了指定请求体为JSON格式,我们在第三个参数中设置'application/json'的Content-Type。
- 如果postAsync调用成功,我们可以在httpResponse对象中访问then回调。
- 我们解析httpResponse.response以将API响应的JSON格式转换为对象。
- 参考API响应的结构,我们使用控制台输出验证我们的HTTP请求的查询参数、请求体和请求头是否正确配置。
当您在Unity编辑器中运行Multiplay服务器并播放场景时,控制台将显示以下内容。