如何将对象传递到亚马逊 SNS

how to pass an object to amazon SNS

我在示例中看到如何将消息字符串传递给 amazon sns sdk 的发布方法。但是,是否有如何将自定义对象作为消息传递的示例?我尝试将 "MessageStructure" 设置为 "json" 但随后出现 InvalidParameter: Invalid parameter: Message Structure - No default entry in JSON message body 错误。我应该将对象值传递到参数中的什么位置?

有例子吗?

    var params = {
        Message: JSON.stringify(item),
        MessageStructure: 'json',
        TopicArn: topic
        //MessageAttributes: item
    };

    return sns.publishAsync(params);

没有 SDK 支持的方式将自定义对象作为消息传递 -- 消息始终是字符串。当然,您可以使字符串成为对象的序列化版本。

MessageStructure: 'json' 用于不同的目的——当您想要将不同的字符串传递给不同的订阅类型时。在这种情况下,您使消息成为具有 AWS 定义结构的序列化 json 对象,其中每个元素都定义要发送到特定类型订阅(电子邮件、sqs 等)的消息。即使在那种情况下,消息本身也只是字符串。

MessageAttributes 是您添加到消息中以支持特定订阅类型的参数。例如,如果您使用 SNS 与 Apple 的 IOS 通知服务对话,您可能必须提供额外的消息参数或身份验证密钥——MessageAttributes 提供了一种机制来执行此操作。 this AWS documentation.

中对此进行了描述

Jackson 2 非常支持将对象转换为 JSON 字符串,反之亦然。

To String

Cat c = new Cat();
ObjectMapper mapper = new ObjectMapper();
String s = mapper.writeValueAsString(c);

To Object

Cat obj = mapper.readValue(s,Cat.class);

消息需要是一个 JSON 对象,并且需要添加 default 属性 并且应该包含您希望包含在电子邮件中的 JSON。

    var defaultMessage = { "default": item };

    var params = {
        Message: defaultMessage, /*JSON.stringify(item),*/
       ---------^
        MessageStructure: 'json',
        TopicArn: topic
        //MessageAttributes: item
    };

    return sns.publishAsync(params);

使用python,

boto3.client("sns").publish(
        TopicArn=sns_subscription_arn,
        Subject="subject",
        Message=json.dumps({"default": item}),
                    --------^
        MessageStructure="json",
    )

仅供参考,如果您在 AWS 控制台中转到此 SNS 主题,您可以 "publish message" 并选择 "Custom payload for each delivery protocol."。在这里您将看到电子邮件的模板,"default" 属性 被标记为 "Sample fallback message"。

示例如下:https://docs.aws.amazon.com/sns/latest/api/API_Publish.html#API_Publish_Example_2

The JSON format for Message is as follows:

{
    "default": "A message.",
    "email": "A message for email.",
    "email-json": "A message for email (JSON).",
    "http": "A message for HTTP.",
    "https": "A message for HTTPS.",
    "sqs": "A message for Amazon SQS." 
} 

所以,假设你想传递的是一个对象,它对我的​​工作方式是:

const messageObjToSend = {
    ...
}

const params = {
    Message: JSON.stringify({
        default: JSON.stringify( messageObjToSend )
    }),
    MessageStructure: 'json',
    TopicArn: 'arn:aws:sns...'
}