SNS - JSON 消息正文解析失败

问题描述 投票:0回答:2

我正在尝试通过 Amazon SNS 向移动设备发送远程通知。我有一个数据库,用于存储需要提供给 SNS 的 PublishRequest 的 JSON(有效负载)。我在代码中序列化 json 并将其传递给请求。

问题是 SNS 失败并出现错误:“消息结构 - JSON 消息正文无法解析”

作为要求,服务(负责与 SNS 通信并发送通知)必须从 DB (MySQL) 检索 json。

我缺少什么?

数据库是MySQL,服务是用.Net Core编写的

string messageFromDb = JsonConvert.SerializeObject(input.Payload);

var request = new PublishRequest
{
    TargetArn = endpoint.EndpointArn,
    MessageStructure = "json",
    Message = messageFromDb
};

PublishResponse publishResponse = await _client.PublishAsync(request);

来自数据库的 JSON:

{"APNS": {"aps": {"alert": "Check out the new!", "sound": "default"}, "category": {"type": "sports"}}}

我也尝试过这个但没有任何运气:

{"default": "something", "APNS": {"aps": {"alert": "Check out the new games!", "sound": "default"}, "game": {"type": "Xbox"}}}
c# .net amazon-web-services asp.net-core amazon-sns
2个回答
5
投票

终于我明白了,也许这个答案会对某人有所帮助。数据库中的 JSON 应该是

{"aps": {"alert": "Check out the new!", "sound": "default"}, "category": {"type": "sports"}}

.Net 代码应该是:

AWSRoot obj = new AWSRoot(input.Payload);

var request = new PublishRequest
{
    TargetArn = endpoint.EndpointArn,
    MessageStructure = "json",
    Message = JsonConvert.SerializeObject(obj)
};

PublishResponse publishResponse = await _client.PublishAsync(request);

AWSRoot是我们为SNS创建的根对象

public class AWSRoot
{
    public string APNS { get; set; }

    public AWSRoot(string payload) 
    {
        APNS = payload;
    }
}

0
投票

乔治的上述回答很有帮助,并为我指明了正确的方向。这并不是要取代他的答案,但在对我的问题进行多次搜索后,这篇文章是最接近的匹配。

使用 C# .Net 8、Lambda 到 SNS,我不断收到错误

Invalid parameter: Message Structure - No default entry in JSON message body

解决方案是将 AWSRoot 类中的自定义类包装在名为

default
参数的参数中。由于 'default' 是保留字,因此您需要向属性添加
JsonPropertyName
描述符。

代码如下;

public class MyCustomClass
{
  public string foo { get; set; } = string.Empty;
  public string bar { get; set; } = string.Empty;
}


public class AWSRoot
{
  /* The SNS publisher requires an attribute named `default` if the MessageStructure is 'json'*/
  [JsonPropertyName("default")]
  public string Default { get; set; } = string.Empty;
  
  public AWSRoot(string payload)
  {
    Default = payload;
  }
}

var notificationEvent = new MyCustomClass
{
  foo = "Hello",
  bar = "world"
};

AWSRoot obj = new AWSRoot(JsonSerializer.Serialize(notificationEvent));

var publishRequest = new PublishRequest
{
    TopicArn = "your-sns-topic-arn", 
    Message = JsonSerializer.Serialize(obj),
    MessageStructure = "json"
};

var result = await _snsClient.PublishAsync(publishRequest);

我希望这对某人有帮助,因为文档不是很清楚。

© www.soinside.com 2019 - 2024. All rights reserved.