> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 使用 RequestPartyService 从服务端请求 party

> 介绍如何从你自己的游戏服务调用 PlayFab RequestPartyService API,以便为多人聊天和数据会话预配 Party 网络的教程。

本教程介绍如何使用 ***RequestPartyService API*** 从你自己的服务而非严格从客户端请求 party 的步骤,让你通过 HTTP 调用更灵活地控制如何将 PlayFab Party 集成到你的游戏中。

* 它允许你使用自己的身份验证和授权机制,或自定义创建和加入 party 的用户界面与用户体验。
* 它使你能够严格按自己的条件分配 PlayFab Party。通过在服务端管理中继网络,可以使用你自己的服务或借助 [PlayStream 和 CloudScript](/services/playfab/data-analytics/acting-data/action-rules-using-cloudscript-actions-with-playstream) 有效且可靠地建立复杂的网络拓扑。
* 通过让你能够将 Party 创建限制为仅服务端可用,增加了针对客户端滥用的额外防御。

## 先决条件

你需要拥有 PlayFab 账户并已启用 Party 功能。

1. 创建或登录你的 [PlayFab 账户](https://developer.playfab.com)。
2. 通过 PlayFab 账户[在 Game Manager 中启用 Party 功能](/services/playfab/multiplayer/networking/enable-party)。
3. 下载并设置 Party SDK。有关下载链接,请参阅 [Party SDK](/services/playfab/multiplayer/networking/party-sdks/overview)。

<Note>
  本教程是更全面的 [Party 快速入门](/services/playfab/multiplayer/networking/quickstart)一文中某些步骤的替代流程。
</Note>

### 1. 从 Game Manager 获取 PlayFab 标题密钥

1. 登录到 **[Game Manager](https://developer.playfab.com/)**。
2. 选择你的标题。
3. 在右上角选择齿轮图标。
4. 选择 **Title settings**,然后选择 **Secret Keys** 选项卡。

有关详情,请参阅[密钥管理](/services/playfab/live-service-management/gamemanager/secret-key-management)。

### 2. 获取 PlayFab 实体令牌

从你的服务中使用 [GetEntityToken](https://learn.microsoft.com/en-us/rest/api/playfab/authentication/authentication/get-entity-token) REST API,用标题 SecretKey 换取实体令牌。

```js theme={null}
async function getEntityToken(titleId, secretKey) {
  try {

    // Construct the request URL
    const requestUrl =
      `https://${titleId}.playfabapi.com/Authentication/GetEntityToken`;

    // Create headers with your secret key and content type
    const headers = {
      'X-SecretKey': secretKey,
      'Content-Type': 'application/json', // Add this line
    };

    // Make the POST request
    const response = await fetch(requestUrl, {
      method: 'POST',
      headers: headers,
    });

    // Check if the response is successful
    if (response.ok) {
      const responseBody = await response.json();
      console.log(`Entity Token: ${responseBody.data.EntityToken}`);
      return responseBody.data.EntityToken;
    } else {
      console.error(`Error: ${response.status}`);
    }
  } catch (error) {
    console.error(`Exception: ${error.message}`);
  }
}
```

### 3. 发出 POST 请求

使用获取的实体令牌,以所需的 party 参数向 [RequestPartyService](https://learn.microsoft.com/en-us/rest/api/playfab/multiplayer/multiplayer-server/request-party-service) 终结点发出 POST 请求。

```js theme={null}
async function requestPartyService(titleId, entityToken) {
  try {

    // Construct the request URL
    const requestUrl = `https://${titleId}.playfabapi.com/Party/RequestPartyService`;

    // Create headers with the entity token and content type
    const headers = {
      'X-EntityToken': entityToken,
      'Content-Type': 'application/json',
    };

    // Create the request body with PartyNetworkConfiguration and PreferredRegions
    const requestBody = {
      NetworkConfiguration: {
        MaxUsers: 4,
        MaxDevices: 4,
        MaxDevicesPerUser: 1,
        MaxUsersPerDevice: 1,
      },
      PreferredRegions: ['WestUs'],
    };

    // Make the POST request
    const response = await fetch(requestUrl, {
      method: 'POST',
      headers: headers,
      body: JSON.stringify(requestBody),
    });

    // Check if the response is successful
    if (response.ok) {
      const responseBody = await response.json();
      console.log('Party service response:', responseBody);
    } else {
      console.error(`Error: ${response.status}`);
    }
  } catch (error) {
    console.error(`Exception: ${error.message}`);
  }
  return null;
}
```

### 4. 接收响应

发出 POST 请求后,你将收到一个包含[网络描述符](https://learn.microsoft.com/en-us/rest/api/playfab/multiplayer/multiplayer-server/request-party-service#requestpartyserviceresponse)的响应,其中包含客户端连接到 party 服务器所需的所有详细信息。

```json theme={null}
{
    "code": 200,
    "status": "OK",
    "data": {
        "PartyId": "0543645b-9004-4784-95d7-459cef4a23fa",
        "SerializedNetworkDescriptor": "AwBnP28mW2RDBQSQhEeV10Wc70oj+ldlc3RVcwAAAAAAAAAAAAAAAAAAPXqiEpapxSC+Owo1h8qJ5NuEOmtS0oeJqq8h6q5ybZZrbktkbnMtaXIwLTgxZTUtNTI3MWZiZDYtMmMyYS00NGE0LThhNjAtNmZlZjI4ZDAzMjc5Lndlc3R1cy5jbG91ZGFwcC5henVyZS5jb20=",
        "InvitationId": "e95366d4-c9ed-4a6e-94f6-215c1d69d467"
    }
}
```

### 5. 分享网络描述符

将网络描述符分享给你网络的潜在参与者。可以通过多种方式做到这一点。使用 PlayFab Lobby 的客户端应遵循[将 Party 与 Lobby 集成](/services/playfab/multiplayer/networking/party-lobby-integration)中的指南。你还可以出于快速测试目的[手动分享](/services/playfab/multiplayer/networking/quickstart#manually-share-party-network-descriptor) Party 网络描述符,或根据游戏需要使用你自己的大厅服务和邀请机制。

### 6. 连接到 Party 服务器

客户端可以像往常一样使用原生 SDK 通过网络描述符连接到 Party 服务器。如果这是你第一次连接 Party 网络,请参阅快速入门指南中的[连接到 Party 网络](/services/playfab/multiplayer/networking/quickstart#connect-to-a-party-network)部分。

## 另请参阅

* [Party 快速入门](/services/playfab/multiplayer/networking/quickstart)
* [Party 功能](/services/playfab/multiplayer/networking/party-features)
* [Party 示例](/services/playfab/multiplayer/networking/party-samples)
* [多人服务](/services/playfab/multiplayer/mpintro)
* [Party 邀请和安全模型](/services/playfab/multiplayer/networking/concepts-invitations-security-model)
* [Party API 参考文档](/services/playfab/multiplayer/networking/reference/party_members)


## Related topics

- [基础 DRM 与许可证检查](/zh-CN/publishing/xstore-commerce/xstore-basic-drm.md)
- [玩家加密服务](/zh-CN/services/playfab/identity/player-identity/encryption/player-encryption-services.md)
- [XblAchievementsResultHasNext](/zh-CN/reference/live/xsapi-c/achievements_c/functions/xblachievementsresulthasnext.md)
- [为服务到服务身份验证请求 User Store ID](/zh-CN/publishing/xstore-commerce/xstore-requesting-userstoreid.md)
- [PlayFab Party 发行说明](/zh-CN/services/playfab/multiplayer/networking/release-notes.md)
