如何将对象传递到亚马逊 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...'
}
我在示例中看到如何将消息字符串传递给 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...'
}