

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon SNS 消息属性
<a name="sns-message-attributes"></a>

Amazon SNS 支持传输消息属性，这些属性支持您提供与消息相关的结构化元数据项目（如时间戳、地理空间数据、签名和标识符）。对于 SQS 订阅，在启用 [Raw Message Delivery](sns-large-payload-raw-message-delivery.md)（原始消息传输）时，最多可以发送 10 个消息属性。要发送 10 个以上的消息属性，必须禁用 Raw Message Delivery（原始消息传输）。所具有的消息属性（定向到启用了原始消息传输的 Amazon SQS 订阅）超过 10 个的消息将作为客户端错误被丢弃。

消息属性是可选的，并独立于消息正文（但随之一起发送）。接收方可以使用此信息来决定如何处理消息，而不必先处理消息正文。

有关使用 AWS 管理控制台 或发送带有属性的消息的信息 适用于 Java 的 AWS SDK，请参阅[要使用 Amazon SNS 主题发布消息 AWS 管理控制台](sns-publishing.md#sns-publishing-messages)教程。

**注意**  
当消息结构为 String 而不是 JSON 时，仅发送消息属性。

您还可以使用消息属性，帮助构造移动终端节点的推送通知消息。在这种情况下，消息属性仅用于帮助构造推送通知消息。这些属性不会被传递到终端节点，就像在发送带有消息属性的消息到 Amazon SQS 终端节点时一样。

您还可以使用消息属性来让消息变为可通过订阅筛选策略进行筛选。可以将筛选策略应用于主题订阅。应用了筛选策略且筛选策略范围设置为 `MessageAttributes`（默认值）时，订阅将只接收具有策略接受的属性的那些消息。有关更多信息，请参阅 [Amazon SNS 消息筛选](sns-message-filtering.md)。

**注意**  
使用消息属性进行筛选时，该值必须是有效的 JSON 字符串。这样做可以确保将消息传送到启用了消息属性筛选的订阅。

## 消息属性项目和验证
<a name="SNSMessageAttributesNTV"></a>

每个消息属性包含以下项目：
+ **Name** – 消息属性的名称可以包含以下字符：A-Z、a-z、0-9、下划线 (\$1)、连字符 (-) 和句点 (.)。名称不得以句点开头或结尾，并且不应包含连续句点。名称区分大小写，且必须在消息的所有属性名称中是唯一的。名称最多可以有 256 个字符。名称不能以 `AWS.` 或 `Amazon.` （或任何大小写变化形式）开头，因为这些前缀已预留以供 Amazon Web Services 使用。
+ **Type** – 受支持的消息属性数据类型有 `String`、`String.Array`、`Number` 和 `Binary`。数据类型在内容方面具有与消息正文相同的限制。想要了解更多信息，请参阅[消息属性数据类型和验证](#SNSMessageAttributes.DataTypes)部分。
+ **Value** – 用户指定的消息属性值。对于字符串数据类型，值属性的内容必须遵循与消息正文相同的内容限制。不过，如果消息属性用于过滤，则该值必须是有效的 JSON 字符串，以确保与 Amazon SNS 订阅筛选策略兼容。有关更多信息，请参阅 *Amazon Simple Notification Service API 参考*中的[发布](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)操作。

名称、类型和值都不得为空或 null。此外，消息正文也不应为空或 null。消息属性的所有部分 (包括名称、类型和值) 都包含在消息大小限制中，该限制当前是 256 KB。

## 消息属性数据类型和验证
<a name="SNSMessageAttributes.DataTypes"></a>

消息属性数据类型指示 Amazon SNS 处理消息属性值的方式。例如，如果类型是数字，则 Amazon SNS 会验证它是否为数字。

除非另有说明，否则 Amazon SNS 支持所有终端节点的以下逻辑数据类型：
+ **String** – 字符串是使用 UTF-8 二进制编码的 Unicode。有关代码值的列表，请参阅 [http://en.wikipedia。 org/wiki/ASCII](http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters)\$1ASCII\$1printable\$1characters。
**注意**  
消息属性中不支持代理值。例如，使用代理值来表示表情符号将收到以下错误：`Invalid attribute value was passed in for message attribute`。
+ **String.Array** – 格式为字符串的阵列，可以包含多个值。这些值可以是字符串、数字或关键字 `true`、`false` 和 `null`。数字或布尔类型的 String.Array 不需要引号。多个 String.Array 值用逗号分隔。

   AWS Lambda 订阅不支持此数据类型。如果您为 Lambda 终端节点指定此数据类型，它会作为 Amazon SNS 传输给 Lambda 的 JSON 负载中的 `String` 数据类型传递。
+ **Number** – 数字是正或负整数或是浮点数。数字具有足够的范围和精度，以便包含整数、浮点数和双精度数通常支持的大多数可能值。数字的值可以介于 -109 到 109 之间，精确至小数点后 5 位数。系统会删减开头和结尾的 0。

   AWS Lambda 订阅不支持此数据类型。如果您为 Lambda 终端节点指定此数据类型，它会作为 Amazon SNS 传输给 Lambda 的 JSON 负载中的 `String` 数据类型传递。
+ **Binary** – 二进制类型属性可以存储任何二进制数据，例如压缩数据、加密数据或图像。

## 为移动推送通知预留的消息属性
<a name="sns-attrib-mobile-reserved"></a>

下表列出了可用于构造推送通知消息的移动推送通知服务的预留消息属性：

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/sns/latest/dg/sns-message-attributes.html)

1 如果消息属性不符合要求，Apple 将拒绝 Amazon SNS 通知。如需了解更多详情，请参阅 Apple 开发者网站上的 “[向发送通知请求](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns)”。 APNs