From 74a6d61144e66ddc3c07040bfb34d6bf9cce4cbf Mon Sep 17 00:00:00 2001 From: haoxiuwen Date: Thu, 3 Jul 2025 13:23:30 +0800 Subject: [PATCH 1/3] Modify SDK Login by Prioritizing Authorized User Registration --- docs/document/android/login.md | 8 +++++--- docs/document/applet/login.md | 17 +++++------------ docs/document/flutter/login.md | 16 +++++----------- docs/document/harmonyos/login.md | 16 +++++----------- docs/document/ios/login.md | 17 +++++------------ docs/document/react-native/login.md | 23 ++++++----------------- docs/document/unity/login.md | 29 +++++++---------------------- docs/document/web/login.md | 21 +++++++-------------- docs/document/windows/login.md | 29 +++++++---------------------- 9 files changed, 52 insertions(+), 124 deletions(-) diff --git a/docs/document/android/login.md b/docs/document/android/login.md index 4bc165523..d3d348aae 100644 --- a/docs/document/android/login.md +++ b/docs/document/android/login.md @@ -4,7 +4,9 @@ ## 用户注册 -用户注册模式分为以下两种: +1. 可通过以下两种方式调用接口创建用户: + +- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 - 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 @@ -15,9 +17,9 @@ EMClient.getInstance().createAccount(mAccount, mPassword);// 同步方法。 ``` -- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 +2. 通过 [环信控制台](https://console.easemob.com/user/login) 创建用户: -除此以外,可以在[环信即时通讯云控制台](https://console.easemob.com/user/login)创建正式环境下和测试环境下的用户,详见[创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 +可以在 [环信控制台](https://console.easemob.com/user/login) 创建正式环境下和测试环境下的用户,详见 [创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 ## 主动登录 diff --git a/docs/document/applet/login.md b/docs/document/applet/login.md index fb38eace4..eb0e1d81f 100644 --- a/docs/document/applet/login.md +++ b/docs/document/applet/login.md @@ -4,22 +4,15 @@ ## 用户注册 -用户注册支持以下方式: +1. 可通过以下两种方式调用接口创建用户: -- 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 +- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见 [授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和 [批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 -示例代码如下: - -```javascript -conn.registerUser({ - username: "user1", - password: "xxx", -}); -``` +- 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在 [环信控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 -- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 +2. 通过 [环信控制台](https://console.easemob.com/user/login) 创建用户: -除此以外,可以在[环信即时通讯云控制台](https://console.easemob.com/user/login)创建正式环境下和测试环境下的用户,详见[创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 +可以在 [环信控制台](https://console.easemob.com/user/login) 创建正式环境下和测试环境下的用户,详见[创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 ## 登录方式 diff --git a/docs/document/flutter/login.md b/docs/document/flutter/login.md index 962b16f49..81921bf41 100644 --- a/docs/document/flutter/login.md +++ b/docs/document/flutter/login.md @@ -4,21 +4,15 @@ ## 用户注册 -用户注册模式分为以下两种: +1. 可通过以下两种方式调用接口创建用户: -- 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 +- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 -示例代码如下所示: - -```dart -try { - await EMClient.getInstance.createAccount(userId, password); -} on EMError catch (e) {} -``` +- 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 -- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 +2. 通过 [环信控制台](https://console.easemob.com/user/login) 创建用户: -除此以外,可以在[环信即时通讯云控制台](https://console.easemob.com/user/login)创建正式环境下和测试环境下的用户,详见[创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 +可以在 [环信控制台](https://console.easemob.com/user/login) 创建正式环境下和测试环境下的用户,详见 [创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 ## 主动登录 diff --git a/docs/document/harmonyos/login.md b/docs/document/harmonyos/login.md index 63497cef7..dd9627103 100644 --- a/docs/document/harmonyos/login.md +++ b/docs/document/harmonyos/login.md @@ -4,21 +4,15 @@ ## 用户注册 -用户注册模式分为以下两种: +1. 可通过以下两种方式调用接口创建用户: + +- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 - 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 -示例代码如下所示: - -```typescript -ChatClient.getInstance().createAccount(userId, pwd).then(()=> { - // success logic -}); -``` - -- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 +2. 通过 [环信控制台](https://console.easemob.com/user/login) 创建用户: -除此以外,可以在[环信即时通讯云控制台](https://console.easemob.com/user/login)创建正式环境下和测试环境下的用户,详见[创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 +可以在 [环信即时通讯云控制台](https://console.easemob.com/user/login)创建正式环境下和测试环境下的用户,详见 [创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 ## 主动登录 diff --git a/docs/document/ios/login.md b/docs/document/ios/login.md index e7a7e9ff3..2c5f13d8b 100644 --- a/docs/document/ios/login.md +++ b/docs/document/ios/login.md @@ -4,22 +4,15 @@ ## 用户注册 -用户注册模式分为以下两种: +1. 可通过以下两种方式调用接口创建用户: + +- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 - 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 -示例代码如下所示: - -```swift -// 异步方法 -EMClient.shared.register(withUsername: "userId", password: "your password") { userId, e in - -} -``` - -- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 +2. 通过 [环信控制台](https://console.easemob.com/user/login) 创建用户: -除此以外,可以在[环信即时通讯云控制台](https://console.easemob.com/user/login)创建用户,详见[创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 +可以在 [环信即时通讯云控制台](https://console.easemob.com/user/login) 创建用户,详见 [创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 ## 主动登录 diff --git a/docs/document/react-native/login.md b/docs/document/react-native/login.md index e73d0cb49..5446c1577 100644 --- a/docs/document/react-native/login.md +++ b/docs/document/react-native/login.md @@ -4,26 +4,15 @@ ## 用户注册 -用户注册模式分为以下两种: +1. 可通过以下两种方式调用接口创建用户: -- 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 - -示例代码如下所示: - -```typescript -ChatClient.getInstance() - .createAccount(username, password) - .then((value: any) => { - console.log("createAccount: success", value); - }) - .catch((reason: any) => { - console.log("createAccount: fail", reason); - }); -``` +- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 -- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 +- 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在[环控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 + +2. 通过 [环信控制台](https://console.easemob.com/user/login) 创建用户: -除此以外,可以在[环信即时通讯云控制台](https://console.easemob.com/user/login)创建正式环境下和测试环境下的用户,详见[创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 +可以在 [环信控制台](https://console.easemob.com/user/login) 创建正式环境下和测试环境下的用户,详见[创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 ## 主动登录 diff --git a/docs/document/unity/login.md b/docs/document/unity/login.md index c49d4cb85..342124cc7 100644 --- a/docs/document/unity/login.md +++ b/docs/document/unity/login.md @@ -4,36 +4,21 @@ ## 用户注册 -用户注册模式分为以下两种: +1. 可通过以下两种方式调用接口创建用户: -- 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 - -示例代码如下所示: - -```csharp -SDKClient.Instance.CreateAccount(username, password, - callback: new CallBack( - - onSuccess: () => { - Debug.Log("CreateAccount succeed"); - }, +- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在 [环信控制台](https://console.easemob.com/user/login) 的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见 [授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户) 和 [批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户) 的接口介绍。 - onError: (code, desc) => { - Debug.Log($"CreateAccount failed, code: {code} ; desc: {desc}"); - } - ) -); -``` - -- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 +- 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在 [环信控制台](https://console.easemob.com/user/login) 的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 + +2. 通过 [环信控制台](https://console.easemob.com/user/login) 创建用户: -除此以外,可以在[环信即时通讯云控制台](https://console.easemob.com/user/login)创建正式环境下和测试环境下的用户,详见[创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 +可以在 [环信控制台](https://console.easemob.com/user/login) 创建正式环境下和测试环境下的用户,详见 [创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 ## 主动登录 1. **用户 ID + token** 是更加安全的登录方式。 -测试环境下,你在[环信即时通讯云控制台](https://console.easemob.com/user/login)创建用户后,环信服务器会自动为这些用户分配用户 Token,详见[测试环境下创建用户的介绍](/product/enable_and_configure_IM.html#测试环境)。 +测试环境下,你在[环信控制台](https://console.easemob.com/user/login)创建用户后,环信服务器会自动为这些用户分配用户 Token,详见[测试环境下创建用户的介绍](/product/enable_and_configure_IM.html#测试环境)。 在生产环境中,为了安全考虑,你需要在你的应用服务器集成[获取 App Token API](/document/server-side/easemob_app_token.html) 和[获取用户 Token API](/document/server-side/easemob_user_token.html) 实现获取 Token 的业务逻辑,使你的用户从你的应用服务器获取 Token。 diff --git a/docs/document/web/login.md b/docs/document/web/login.md index 241f1b91a..b9efd9335 100644 --- a/docs/document/web/login.md +++ b/docs/document/web/login.md @@ -4,30 +4,23 @@ ## 用户注册 -用户注册支持以下方式: +1. 可通过以下两种方式调用接口创建用户: -- 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 +- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在 [环信云控制台](https://console.easemob.com/user/login) 的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见 [授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户) 和 [批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户) 的接口介绍。 -示例代码如下所示: - -```javascript -conn.registerUser({ - username: "user1", - password: "xxx", -}); -``` +- 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在 [环信控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 -- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 +2. 通过 [环信控制台](https://console.easemob.com/user/login) 创建用户: -除此以外,可以在[环信即时通讯云控制台](https://console.easemob.com/user/login)创建正式环境下和测试环境下的用户,详见[创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 +可以在 [环信控制台](https://console.easemob.com/user/login) 创建正式环境下和测试环境下的用户,详见 [创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 ## 登录方式 1. **用户 ID + token** 是更加安全的登录方式。 -测试环境下,你在 [环信即时通讯云控制台](https://console.easemob.com/user/login) 创建用户后,环信服务器会自动为这些用户分配用户 Token,详见 [创建用户的介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 +测试环境下,你在 [环信控制台](https://console.easemob.com/user/login) 创建用户后,环信服务器会自动为这些用户分配用户 Token,详见 [创建用户的介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 -在生产环境中,为了安全考虑,你需要在你的应用服务器集成[获取 App Token API](/document/server-side/easemob_app_token.html) 和[获取用户 Token API](/document/server-side/easemob_user_token.html) 实现获取 Token 的业务逻辑,使你的用户从你的应用服务器获取 Token。SDK 会在 Token 过期时或者其有效期达到 80%(4.15.0 之前为 50%)时分别回调 `onTokenExpired` 和 `onTokenWillExpire` 通知用户更新 Token。你可以采取各种机制更新 Token,例如,每次登录时更新 token。 +在生产环境中,为了安全考虑,你需要在你的应用服务器集成 [获取 App Token API](/document/server-side/easemob_app_token.html) 和 [获取用户 Token API](/document/server-side/easemob_user_token.html) 实现获取 Token 的业务逻辑,使你的用户从你的应用服务器获取 Token。SDK 会在 Token 过期时或者其有效期达到 80%(4.15.0 之前为 50%)时分别回调 `onTokenExpired` 和 `onTokenWillExpire` 通知用户更新 Token。你可以采取各种机制更新 Token,例如,每次登录时更新 token。 ```javascript conn diff --git a/docs/document/windows/login.md b/docs/document/windows/login.md index 9ba0f6f3b..f1f5af8b3 100644 --- a/docs/document/windows/login.md +++ b/docs/document/windows/login.md @@ -4,38 +4,23 @@ ## 用户注册 -用户注册模式分为以下两种: +1. 可通过以下两种方式调用接口创建用户: -- 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 - -示例代码如下所示: - -```csharp -SDKClient.Instance.CreateAccount(username, password, - callback: new CallBack( - - onSuccess: () => { - Debug.Log("CreateAccount succeed"); - }, +- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在 [环信控制台](https://console.easemob.com/user/login) 的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见 [授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户) 和 [批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户) 的接口介绍。 - onError: (code, desc) => { - Debug.Log($"CreateAccount failed, code: {code} ; desc: {desc}"); - } - ) -); -``` +- 开放注册:一般在体验 Demo 和测试环境时使用,正式环境中不推荐使用该方式注册环信账号。要使用开放注册,需要在 [环信控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**开放注册**。只有打开该开关,才能使用客户端或 [REST API](/document/server-side/account_system.html#开放注册单个用户)开放注册用户。 -- 授权注册:通过环信提供的 REST API 注册环信用户账号,注册后保存到你的服务器或返给客户端。要使用授权注册,你需要在[环信即时通讯云控制台](https://console.easemob.com/user/login)的**即时通讯** > **服务概览**的**设置**区域,将**用户注册模式**设置为**授权注册**。相关的 REST API 介绍,详见[授权注册单个用户](/document/server-side/account_system.html#授权注册单个用户)和[批量授权注册用户](/document/server-side/account_system.html#批量授权注册用户)的接口介绍。 +2. 通过 [环信控制台](https://console.easemob.com/user/login) 创建用户: -除此以外,可以在[环信即时通讯云控制台](https://console.easemob.com/user/login)创建正式环境下和测试环境下的用户,详见[创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 +可以在[环信控制台](https://console.easemob.com/user/login)创建正式环境下和测试环境下的用户,详见 [创建用户相关介绍](/product/enable_and_configure_IM.html#创建-im-用户)。 ## 主动登录 1. **用户 ID + token** 是更加安全的登录方式。 -测试环境下,你在[环信即时通讯云控制台](https://console.easemob.com/user/login)创建用户后,环信服务器会自动为这些用户分配用户 Token,详见[测试环境下创建用户的介绍](/product/enable_and_configure_IM.html#测试环境)。 +测试环境下,你在 [环信控制台](https://console.easemob.com/user/login) 创建用户后,环信服务器会自动为这些用户分配用户 Token,详见 [测试环境下创建用户的介绍](/product/enable_and_configure_IM.html#测试环境)。 -在生产环境中,为了安全考虑,你需要在你的应用服务器集成[获取 App Token API](/document/server-side/easemob_app_token.html) 和[获取用户 Token API](/document/server-side/easemob_user_token.html) 实现获取 Token 的业务逻辑,使你的用户从你的应用服务器获取 Token。 +在生产环境中,为了安全考虑,你需要在你的应用服务器集成 [获取 App Token API](/document/server-side/easemob_app_token.html) 和 [获取用户 Token API](/document/server-side/easemob_user_token.html) 实现获取 Token 的业务逻辑,使你的用户从你的应用服务器获取 Token。 使用 token 登录时需要处理 token 过期的问题,比如在每次登录时更新 token 等机制。 From e1c9fb3f9c80f3474f30d24377252424788a40bc Mon Sep 17 00:00:00 2001 From: haoxiuwen Date: Thu, 3 Jul 2025 13:53:14 +0800 Subject: [PATCH 2/3] Remove -L from REST APIs --- docs/document/server-side/account_system.md | 2 +- docs/document/server-side/chatroom_manage.md | 2 +- .../server-side/chatroom_superadmin.md | 2 +- .../server-side/conversation_delete.md | 2 +- docs/document/server-side/group_manage.md | 2 +- .../server-side/group_member_attribute.md | 8 ++-- .../server-side/message_attachment_storage.md | 2 +- .../document/server-side/message_broadcast.md | 48 +++++++++---------- docs/document/server-side/message_delete.md | 10 ++-- docs/document/server-side/push.md | 16 +++---- .../server-side/push_result_statistics.md | 2 +- docs/document/server-side/user_global_mute.md | 6 +-- .../document/server-side/user_relationship.md | 2 +- docs/push/push_by_tag.md | 16 +++---- docs/push/push_send_notification.md | 2 +- 15 files changed, 61 insertions(+), 61 deletions(-) diff --git a/docs/document/server-side/account_system.md b/docs/document/server-side/account_system.md index 2dd1c3455..4532e501d 100644 --- a/docs/document/server-side/account_system.md +++ b/docs/document/server-side/account_system.md @@ -1525,7 +1525,7 @@ GET https://{host}/{org_name}/{app_name}/users/{username}/resources ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X GET 'http://XXXX/XXXX/XXXX/users/XXXX/resources' \ +curl -X GET 'http://XXXX/XXXX/XXXX/users/XXXX/resources' \ -H 'Accept: application/json' \ -H 'Authorization: Bearer ' ``` diff --git a/docs/document/server-side/chatroom_manage.md b/docs/document/server-side/chatroom_manage.md index be8a5275f..72eb27fe9 100644 --- a/docs/document/server-side/chatroom_manage.md +++ b/docs/document/server-side/chatroom_manage.md @@ -123,7 +123,7 @@ GET https://{host}/{org_name}/{app_name}/chatrooms?limit={N}&cursor={cursor} ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X GET 'https://XXXX/XXXX/XXXX/chatrooms?limit=10' \ +curl -X GET 'https://XXXX/XXXX/XXXX/chatrooms?limit=10' \ --header 'Authorization: Bearer ' ``` diff --git a/docs/document/server-side/chatroom_superadmin.md b/docs/document/server-side/chatroom_superadmin.md index 86560c455..cd433298b 100644 --- a/docs/document/server-side/chatroom_superadmin.md +++ b/docs/document/server-side/chatroom_superadmin.md @@ -298,7 +298,7 @@ DELETE https://{host}/{org_name}/{app_name}/chatrooms/super_admin/{superAdmin} ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X DELETE 'https://XXXX/XXXX/XXXX/chatrooms/super_admin/XXXX' +curl -X DELETE 'https://XXXX/XXXX/XXXX/chatrooms/super_admin/XXXX' --header 'Authorization: Bearer ' ``` diff --git a/docs/document/server-side/conversation_delete.md b/docs/document/server-side/conversation_delete.md index 5560c3ad7..68caf215b 100644 --- a/docs/document/server-side/conversation_delete.md +++ b/docs/document/server-side/conversation_delete.md @@ -79,7 +79,7 @@ DELETE https://{host}/{org_name}/{app_name}/users/{username}/user_channel ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X DELETE 'https://XXXX/XXXX/XXXX/users/u1/user_channel' \ +curl -X DELETE 'https://XXXX/XXXX/XXXX/users/u1/user_channel' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ diff --git a/docs/document/server-side/group_manage.md b/docs/document/server-side/group_manage.md index 7a8aa6123..0d663a5f1 100644 --- a/docs/document/server-side/group_manage.md +++ b/docs/document/server-side/group_manage.md @@ -642,7 +642,7 @@ GET https://{host}/{org_name}/{app_name}/chatgroups/user/{username}?pagesize={}& ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X GET 'http://XXXX/XXXX/XXXX/chatgroups/user/XXXX' \ +curl -X GET 'http://XXXX/XXXX/XXXX/chatgroups/user/XXXX' \ -H 'Authorization: Bearer ' ``` diff --git a/docs/document/server-side/group_member_attribute.md b/docs/document/server-side/group_member_attribute.md index 3bd4b25ae..3f2f7c302 100644 --- a/docs/document/server-side/group_member_attribute.md +++ b/docs/document/server-side/group_member_attribute.md @@ -101,7 +101,7 @@ PUT https://{host}/{org_name}/{app_name}/metadata/chatgroup/{group_id}/user/{use ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X PUT 'https://XXXX/XXXX/XXXX/metadata/chatgroup/XXXX/user/XXXX' \ +curl -X PUT 'https://XXXX/XXXX/XXXX/metadata/chatgroup/XXXX/user/XXXX' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ -H 'Authorization: Bearer ' \ @@ -193,7 +193,7 @@ PUT https://{host}/{org_name}/{app_name}/metadata/chatgroup/{group_id}/users/bat ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X PUT 'http://XXXX/XXXX/XXXX/metadata/chatgroup/XXXX/users/batch' \ +curl -X PUT 'http://XXXX/XXXX/XXXX/metadata/chatgroup/XXXX/users/batch' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ -H 'Authorization: Bearer ' \ @@ -305,7 +305,7 @@ GET https://{host}/{org_name}/{app_name}/metadata/chatgroup/{group_id}/user/{use ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X GET 'https://a1-hsb.easemob.com/easemob-demo/testy/metadata/chatgroup/207059303858177/user/test2' \ +curl -X GET 'https://a1-hsb.easemob.com/easemob-demo/testy/metadata/chatgroup/207059303858177/user/test2' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' -H 'Authorization: Bearer YWMtozZwfsFFEe2oQTE6aob5eQAAAAAAAAAAAAAAAAAAAAExCXvf5bRGAJBgXNYFJVQ9AQMAAAGG2MUClwBPGgDsI1GYg1QtapTEdGyrm29Eu6L8qx60lDZ9TJRDOQjEsw' \ @@ -389,7 +389,7 @@ POST https://{host}/{org_name}/{app_name}/metadata/chatgroup/{group_id}/get ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X POST 'https://XXXX/XXXX/XXXX/metadata/chatgroup/XXXX/get'\ +curl -X POST 'https://XXXX/XXXX/XXXX/metadata/chatgroup/XXXX/get'\ -H'Content-Type: application/json'\ -H'Accept: application/json'\ -H'Authorization: Bearer '\ diff --git a/docs/document/server-side/message_attachment_storage.md b/docs/document/server-side/message_attachment_storage.md index 3ea707b53..4c88da46d 100644 --- a/docs/document/server-side/message_attachment_storage.md +++ b/docs/document/server-side/message_attachment_storage.md @@ -83,7 +83,7 @@ POST https://{host}/{org_name}/{app_name}/users/{username}/chatfiles/lifetime ```shell # 将 替换为你的用户 Token -curl -X PUT -L "http://localhost/{org}/{app}/users/{username}/chatfiles/lifetime" \ +curl -X PUT "http://localhost/{org}/{app}/users/{username}/chatfiles/lifetime" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer " \ -d '{ diff --git a/docs/document/server-side/message_broadcast.md b/docs/document/server-side/message_broadcast.md index 817c799e8..3bebea6de 100644 --- a/docs/document/server-side/message_broadcast.md +++ b/docs/document/server-side/message_broadcast.md @@ -78,7 +78,7 @@ POST https://{host}/{org_name}/{app_name}/messages/broadcast ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -100,7 +100,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -128,7 +128,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -153,7 +153,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -181,7 +181,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -205,7 +205,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -229,7 +229,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -251,7 +251,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -373,7 +373,7 @@ POST https://{host}/{org_name}/{app_name}/messages/users/broadcast ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -393,7 +393,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -419,7 +419,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -442,7 +442,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -467,7 +467,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -489,7 +489,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -511,7 +511,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -531,7 +531,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/users/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -659,7 +659,7 @@ POST https://{host}/{org_name}/{app_name}/messages/chatrooms/broadcast ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -680,7 +680,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -707,7 +707,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -731,7 +731,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -757,7 +757,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -780,7 +780,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -803,7 +803,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -824,7 +824,7 @@ curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ ```bash # 将 替换为你在服务端生成的 App Token -curl -L 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/chatrooms/broadcast' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ diff --git a/docs/document/server-side/message_delete.md b/docs/document/server-side/message_delete.md index 8df049064..35a12ad07 100644 --- a/docs/document/server-side/message_delete.md +++ b/docs/document/server-side/message_delete.md @@ -109,7 +109,7 @@ DELETE https://{host}/{org_name}/{app_name}/rest/message/roaming/chat/user/{user ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X DELETE 'https://XXXX/XXXX/XXXX/rest/message/roaming/chat/user/XXXX?userId=XXXX&msgIdList=XXXX&isNotify=false' \ +curl -X DELETE 'https://XXXX/XXXX/XXXX/rest/message/roaming/chat/user/XXXX?userId=XXXX&msgIdList=XXXX&isNotify=false' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' @@ -199,7 +199,7 @@ DELETE https://{host}/{org_name}/{app_name}/rest/message/roaming/group/user/{use ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X DELETE 'https://XXXX/XXXX/XXXX/rest/message/roaming/group/user/XXXX?groupId=XXXX&msgIdList=XXXXisNotify=false' \ +curl -X DELETE 'https://XXXX/XXXX/XXXX/rest/message/roaming/group/user/XXXX?groupId=XXXX&msgIdList=XXXXisNotify=false' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' @@ -275,7 +275,7 @@ POST https://{host}/{org_name}/{app_name}/rest/message/roaming/user/{userId}/del ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X POST 'https://XXXX/XXXX/XXXX/rest/message/roaming/user/XXXX/delete/all' \ +curl -X POST 'https://XXXX/XXXX/XXXX/rest/message/roaming/user/XXXX/delete/all' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: Content-Type: application/json' \ -H 'Accept: Accept: application/json' @@ -362,7 +362,7 @@ DELETE https://{host}/{org_name}/{app_name}/rest/message/roaming/chat/user/{user ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X DELETE 'http://XXXX/XXXX/XXXX/rest/message/roaming/chat/user/XXXX/time?userId=XXXX&delTime=1659014868000&isNotify=false' \ +curl -X DELETE 'http://XXXX/XXXX/XXXX/rest/message/roaming/chat/user/XXXX/time?userId=XXXX&delTime=1659014868000&isNotify=false' \ -H 'Authorization: Bearer ' ``` @@ -447,7 +447,7 @@ DELETE https://{host}/{org_name}/{app_name}/rest/message/roaming/group/user/{use ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X DELETE 'http://XXXX/XXXX/XXXX/rest/message/roaming/group/user/XXXX/time?groupId=XXXX&delTime=1659014868000&isNotify=false' \ +curl -X DELETE 'http://XXXX/XXXX/XXXX/rest/message/roaming/group/user/XXXX/time?groupId=XXXX&delTime=1659014868000&isNotify=false' \ -H 'Authorization: Bearer ' ``` diff --git a/docs/document/server-side/push.md b/docs/document/server-side/push.md index 938e9de48..10ed8ffad 100644 --- a/docs/document/server-side/push.md +++ b/docs/document/server-side/push.md @@ -108,7 +108,7 @@ PUT https://{host}/{org_name}/{app_name}/users/{userId}/push/binding **绑定请求** ```shell -curl -L -X PUT 'https://XXXX/XXXX/XXXX/users/XXXX/push/binding' \ +curl -X PUT 'https://XXXX/XXXX/XXXX/users/XXXX/push/binding' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -121,7 +121,7 @@ curl -L -X PUT 'https://XXXX/XXXX/XXXX/users/XXXX/push/binding' \ **解除绑定** ```shell -curl -L -X PUT 'https://XXXX/XXXX/XXXX/users/XXXX/push/binding' \ +curl -X PUT 'https://XXXX/XXXX/XXXX/users/XXXX/push/binding' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ @@ -208,7 +208,7 @@ GET https://{host}/{org_name}/{app_name}/users/{userId}/push/binding #### 请求示例 ```shell -curl -L -X GET 'https://XXXX/XXXX/XXXX/users/XXXX/push/binding' \ +curl -X GET 'https://XXXX/XXXX/XXXX/users/XXXX/push/binding' \ -H 'Authorization: Bearer ' ``` @@ -596,7 +596,7 @@ PUT https://{host}/{org}/{app}/users/{userId}/notification/{chattype}/{key} ```bash // 你需要将 替换为你的用户 Token -curl -L -X PUT 'https://XXXX/XXXX/XXXX/users/XXXX/notification/user/XXXX' \ +curl -X PUT 'https://XXXX/XXXX/XXXX/users/XXXX/notification/user/XXXX' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ @@ -681,7 +681,7 @@ GET https://{host}/{org}/{app}/users/{userId}/notification/{chattype}/{key} ```bash // 请将 替换为你的用户 Token -curl -L -X GET 'https://XXXX/XXXX/XXXX/users/XXXX/notification/chatgroup/XXXX' \ +curl -X GET 'https://XXXX/XXXX/XXXX/users/XXXX/notification/chatgroup/XXXX' \ -H 'Authorization: Bearer ' ``` @@ -758,7 +758,7 @@ PUT https://{host}/{org}/{app}/users/{userId}/notification/language #### 请求示例 ```bash -curl -L -X PUT 'https://XXXX/XXXX/XXXX/users/XXXX/notification/language' \ +curl -X PUT 'https://XXXX/XXXX/XXXX/users/XXXX/notification/language' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ @@ -830,7 +830,7 @@ GET https://{host}/{org_name}/{app_name}/users/{userId}/notification/language #### 请求示例 ```bash -curl -L -X GET 'https://XXXX/XXXX/XXXX/users/XXXX/notification/language' \ +curl -X GET 'https://XXXX/XXXX/XXXX/users/XXXX/notification/language' \ -H 'Authorization: Bearer ' ``` @@ -1189,7 +1189,7 @@ curl -X PUT 'https://XXXX/XXXX/XXXX/users/XXXX/notification/template' \ 关于推送标题和推送内容参数的填充,即 `title_pattern` 和 `content_pattern`,详见[创建离线推送模板](#创建离线推送模板)。 ```shell -curl -L -X POST 'https://XXXX/XXXX/XXXX/messages/users' \ +curl -X POST 'https://XXXX/XXXX/XXXX/messages/users' \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer ' \ -d '{ diff --git a/docs/document/server-side/push_result_statistics.md b/docs/document/server-side/push_result_statistics.md index 44d6d2d59..2c53df1fe 100644 --- a/docs/document/server-side/push_result_statistics.md +++ b/docs/document/server-side/push_result_statistics.md @@ -72,7 +72,7 @@ GET https://{host}/{org_name}/{app_name}/push/data/offline-push/begin/{startTime ```shell 将 替换为你在服务端生成的 App Token -curl -L -g -X GET 'https://XXXX/XXXX/XXXX/push/data/offline-push/begin/2024-04-01/end/2024-04-02?platform=ALL' \ +curl -g -X GET 'https://XXXX/XXXX/XXXX/push/data/offline-push/begin/2024-04-01/end/2024-04-02?platform=ALL' \ -H 'Authorization: Bearer ``` diff --git a/docs/document/server-side/user_global_mute.md b/docs/document/server-side/user_global_mute.md index b86d5f579..c441452c6 100644 --- a/docs/document/server-side/user_global_mute.md +++ b/docs/document/server-side/user_global_mute.md @@ -116,7 +116,7 @@ POST https://{host}/{org_name}/{app_name}/mutes ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X POST 'https://XXXX/XXXX/XXXX/mutes' \ +curl -X POST 'https://XXXX/XXXX/XXXX/mutes' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ @@ -214,7 +214,7 @@ GET https://{host}/{org_name}/{app_name}/mutes/{username} ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X GET 'https://XXXX/XXXX/XXXX/mutes/zs1' \ +curl -X GET 'https://XXXX/XXXX/XXXX/mutes/zs1' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ @@ -313,7 +313,7 @@ GET https://{host}/{org_name}/{app_name}/mutes ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X GET 'https://XXXX/XXXX/XXXX/mutes?pageNum=1&pageSize=10' \ +curl -X GET 'https://XXXX/XXXX/XXXX/mutes?pageNum=1&pageSize=10' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ diff --git a/docs/document/server-side/user_relationship.md b/docs/document/server-side/user_relationship.md index 85ae7f168..795094287 100644 --- a/docs/document/server-side/user_relationship.md +++ b/docs/document/server-side/user_relationship.md @@ -413,7 +413,7 @@ GET https://{host}/{org_name}/{app_name}/user/{username}/contacts?limit={N}&curs ```shell # 将 替换为你在服务端生成的 App Token -curl -L -X GET 'https://XXXX/XXXX/XXXX/user/XXXX/contacts?limit=10&needReturnRemark=true' \ +curl -X GET 'https://XXXX/XXXX/XXXX/user/XXXX/contacts?limit=10&needReturnRemark=true' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json' \ -H 'Authorization: Bearer ' diff --git a/docs/push/push_by_tag.md b/docs/push/push_by_tag.md index afee21f40..e27a59587 100644 --- a/docs/push/push_by_tag.md +++ b/docs/push/push_by_tag.md @@ -85,7 +85,7 @@ POST https://{host}/{org_name}/{app_name}/push/label ```shell 将 替换为你在服务端生成的 App Token -curl -L -X POST 'localhost/hx/hxdemo/push/label' \ +curl -X POST 'localhost/hx/hxdemo/push/label' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ @@ -156,7 +156,7 @@ GET https://{host}/{org_name}/{app_name}/push/label/{labelname} ```shell 将 替换为你在服务端生成的 App Token -curl -L -X GET 'localhost/hx/hxdemo/push/label/90' \ +curl -X GET 'localhost/hx/hxdemo/push/label/90' \ -H 'Authorization: Bearer ' ``` @@ -226,7 +226,7 @@ GET https://{host}/{org_name}/{app_name}/push/label ```shell 将 替换为你在服务端生成的 App Token -curl -L -X GET 'localhost/hx/hxdemo/push/label' \ +curl -X GET 'localhost/hx/hxdemo/push/label' \ -H 'Authorization: Bearer ' ``` @@ -297,7 +297,7 @@ DELETE https://{host}/{org_name}/{app_name}/push/label/{labelname} ```shell 将 替换为你在服务端生成的 App Token -curl -L -X DELETE 'localhost/hx/hxdemo/push/label/post-90s' \ +curl -X DELETE 'localhost/hx/hxdemo/push/label/post-90s' \ -H 'Authorization: Bearer ' ``` @@ -364,7 +364,7 @@ POST https://{host}/{org_name}/{app_name}/push/label/{labelname}/user ```shell 将 替换为你在服务端生成的 App Token -curl -L -X POST 'localhost/hx/hxdemo/push/label/post-90s/user' \ +curl -X POST 'localhost/hx/hxdemo/push/label/post-90s/user' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ @@ -436,7 +436,7 @@ GET https://{host}/{org_name}/{app_name}/push/label/{labelname}/user/{username} ```shell 将 替换为你在服务端生成的 App Token -curl -L -X GET 'localhost/hx/hxdemo/push/label/post-90s/user/hx1' \ +curl -X GET 'localhost/hx/hxdemo/push/label/post-90s/user/hx1' \ -H 'Authorization: Bearer ' ``` @@ -508,7 +508,7 @@ GET https://{host}/{org_name}/{app_name}/push/label/{labelname}/user ```shell 将 替换为你在服务端生成的 App Token -curl -L -X GET 'localhost/hx/hxdemo/push/label/post-90s/user?limit=1' \ +curl -X GET 'localhost/hx/hxdemo/push/label/post-90s/user?limit=1' \ -H 'Authorization: Bearer ' ``` @@ -581,7 +581,7 @@ DELETE https://{host}/{org_name}/{app_name}/push/label/{labelname}/user ```shell 将 替换为你在服务端生成的 App Token -curl -L -X DELETE 'localhost/hx/hxdemo/push/label/post-90s/user' \ +curl -X DELETE 'localhost/hx/hxdemo/push/label/post-90s/user' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ diff --git a/docs/push/push_send_notification.md b/docs/push/push_send_notification.md index bab7e03c5..12e080b7d 100644 --- a/docs/push/push_send_notification.md +++ b/docs/push/push_send_notification.md @@ -387,7 +387,7 @@ POST https://{host}/{org_name}/{app_name}/push/list/label ```shell 将 替换为你在服务端生成的 App Token -curl -L -X POST 'http://a1.easemob.com/easemob/easeim/push/list/label' \ +curl -X POST 'http://a1.easemob.com/easemob/easeim/push/list/label' \ -H 'Authorization: Bearer ' \ -H 'Content-Type: application/json' \ -d '{ From d8a3aad36747e85169c9a1c9a8a1ae5a2fa84308 Mon Sep 17 00:00:00 2001 From: haoxiuwen Date: Thu, 3 Jul 2025 14:35:26 +0800 Subject: [PATCH 3/3] Modify Demo Doc --- .../public/images/applet/applet-demo.png | Bin 13800 -> 41986 bytes docs/product/demo.md | 56 ++++++++++-------- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/docs/.vuepress/public/images/applet/applet-demo.png b/docs/.vuepress/public/images/applet/applet-demo.png index fe6776e6e2d673dddf08593f4f9f948b22a1758b..d773450217a6eebe3e1bfa3f831019edd7dd371d 100644 GIT binary patch literal 41986 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 literal 13800 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 e&@PJ|i{k}q+^zvS+)UE|0000 - + - - + - - - + + + + | 客户端 | 新 Demo | 旧 Demo | | :------------- | :----- | :----- | -| Android | Kotlin Demo,v4.6.0 及以上 |
- Java Demo,v4.5.0 及以下
- 查看 [Demo 源码地址](https://github.com/easemob/chat-android),环信不再维护该 Demo 源码 | -| iOS | Swift Demo,v4.6.0 及以上 |
- Objective-C Demo,4.5.0 及以下。
- 查看 [Demo 源码地址](https://github.com/easemob/easemob-demo-ios/tree/OCDemo),环信不再维护该 Demo 源码 | -| Web | Vue 3 Demo | Vue 2 Demo
-可查看 [Demo 源码地址](https://github.com/easemob/webim-vue-demo/tree/dev-4.0),环信不再维护该 Demo 源码| +| Android |
- Kotlin Demo,v4.6.0 及以上
- 查看 [Demo 源码地址](https://github.com/easemob/easemob-demo-android) |
- Java Demo,v4.5.0 及以下
- 查看 [Demo 源码地址](https://github.com/easemob/chat-android),环信不再维护该 Demo 源码 | +| iOS |
- Swift Demo,v4.6.0 及以上
- 查看 [Demo 源码地址](https://github.com/easemob/easemob-demo-ios) |
- Objective-C Demo,4.5.0 及以下。
- 查看 [Demo 源码地址](https://github.com/easemob/easemob-demo-ios/tree/OCDemo),环信不再维护该 Demo 源码 | +| Web |
- React Demo
- 可查看 [Demo 源码地址](https://github.com/easemob/easemob-demo-react/tree/dev_4.0) | | +| Web |
- Vue 3 Demo
- 可查看 [Demo 源码地址](https://github.com/easemob/webim-vue-demo/tree/demo-vue3) | Vue 2 Demo
-可查看 [Demo 源码地址](https://github.com/easemob/webim-vue-demo/tree/dev-4.0),环信不再维护该 Demo 源码| ## Uni-app Demo @@ -78,6 +84,19 @@ +## 微信小程序 + + + + + + + ## Flutter Demo @@ -99,7 +118,7 @@ -## React Native/React Demo +## React Native Demo - - - - - +