# 更新

`POST` `https://api.pushwoosh.com/messaging/v2/update`

将先前创建的、由其 `message_code` 标识的消息替换为新的定义。此替换是**完全替换，而非修补**：新的定义将完全按照发送的内容应用，且 `message_code` 不会改变。

仅当消息仍处于**待处理**状态时，才可进行更新——即消息已安排在未来发送，但尚未被提取以进行处理或投递。

<Aside type="caution" title="重要">

- `request` 字段是一个完整的 [`Notify`](/zh/developer/api-reference/messaging-api-v2/notify/) 定义。您省略的字段**不会**从原始消息中继承——它们将被重置。请发送您想要的完整消息，而不仅仅是更改的部分。

- 如果消息已在处理中、已投递、已取消或已删除，API 将返回 `400`。此调用不是幂等的。在更新前，请检查消息状态。
</Aside>

要检查消息是否仍处于可更新状态，请参阅[检查消息状态](#checking-message-status)。


## 请求

在 `Authorization: Token <API_TOKEN>` 标头中使用您的[服务器 API 令牌](/zh/developer/api-reference/api-access-token/#server-api-token)进行身份验证。

| 字段 | 类型 | 是否必需 | 描述 |
|---|---|---|---|
| `message_code` | 字符串 | 是 | 要更新的消息的[消息代码](/zh/developer/api-reference/api-identifiers/#message-code)，由 [`Notify`](/zh/developer/api-reference/messaging-api-v2/notify/) 在 `result.message_code` 中返回。 |
| `request` | 对象 | 是 | 消息的完整新定义。与 [`Notify`](/zh/developer/api-reference/messaging-api-v2/notify/) 请求正文的结构相同——一个 `segment` 或 `transactional` 对象。验证方式与 `Notify` 完全相同。 |

### 请求示例

重新安排一条 segment 消息并更改其内容：

```bash
curl -X POST https://api.pushwoosh.com/messaging/v2/update \
  -H "Authorization: Token YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "message_code": "XXXX-XXXXXXXX-XXXXXXXX",
    "request": {
      "segment": {
        "application": "XXXXX-XXXXX",
        "platforms": ["IOS", "ANDROID"],
        "code": "active_users",
        "payload": {
          "content": {
            "localized_content": {
              "en": {
                "ios":     { "body": "Updated message" },
                "android": { "body": "Updated message" }
              }
            }
          }
        },
        "schedule": { "at": "2026-05-02T12:00:00Z" },
        "message_type": "MESSAGE_TYPE_MARKETING"
      }
    }
  }'
```

## 响应

成功后，返回 HTTP 200 以及更新后消息的结果。`message_code` 保持不变。

```json
{
  "result": {
    "message_code": "XXXX-XXXXXXXX-XXXXXXXX",
    "unknown_identifiers": []
  }
}
```

- `message_code` (字符串)：与请求中传入的代码相同。
- `unknown_identifiers` (字符串数组)：在新定义中发现的、未找到的标识符（如适用）（请参阅 [`Notify`](/zh/developer/api-reference/messaging-api-v2/notify/)）。

## 错误

错误使用标准的 gRPC-Gateway 错误封套：`{ "code": ..., "message": ..., "details": [...] }`。

| HTTP 状态 | 条件 |
|---|---|
| `400` | 缺少 `message_code`。 |
| `400` | 新的 `request` 定义缺失或无效（其验证方式与 [`Notify`](/zh/developer/api-reference/messaging-api-v2/notify/) 完全相同）。 |
| `400` | 消息不处于可更新状态（不再是 `pending` 状态）。 |
| `403` | 消息属于另一个账户。 |
| `404` | 给定的 `message_code` 不存在任何消息。 |
| `500` | 加载消息或应用更新时发生内部错误。请重试请求。 |


**示例**

更新一条不再存在的消息会返回 HTTP `404`：

```json
{
  "code": 5,
  "message": "message not found",
  "details": []
}
```

## 检查消息状态

在更新之前，您可以验证消息是否仍处于可更新状态。除了在控制面板的消息表格中读取**状态**列（[**Campaigns → One-time messages**](/zh/product/statistics-and-analytics/message-history/)）外，您还可以通过 [`messages:list`](/zh/developer/api-reference/statistics-api/message-statistics-api/#messageslist) 以编程方式查询状态：

- 在 `filters.messages_codes` 数组中传入 `message_code`（以及必需的 `filters.application`）。
- 读取 `items[]` 中匹配条目的 `status` 字段。

<Aside type="note">
`messages:list` 是 Statistics API 的一部分，并且使用与此端点不同的身份验证标头：`Authorization: Api <Server Key>`。
</Aside>

## 相关内容

<CardGrid>
  <LinkCard title="通知" href="/developer/api-reference/messaging-api-v2/notify/" />
  <LinkCard title="取消" href="/developer/api-reference/messaging-api-v2/cancel/" />
  <LinkCard title="消息统计" href="/developer/api-reference/statistics-api/message-statistics-api/#messageslist" />
  <LinkCard title="Messaging API v2 概述" href="/developer/api-reference/messaging-api-v2/" />
  <LinkCard title="从 v1 迁移" href="/developer/api-reference/messaging-api-v2/migration-from-v1/" />
</CardGrid>