【问题标题】:Slack api request serializationSlack api 请求序列化
【发布时间】:2019-07-11 02:28:33
【问题描述】:

不知何故模型没有反序列化,但如果将 SlackResponse 类更改为字符串,那么里面将是原始 json,因为它可能有来自 JSON.Net 的设置,她通常会反序列化什么?

输入数据

payload={\"type\":\"message_action\",\"token\":\"000\",\"action_ts\":\"000\",\"team\":{\ "id\":\"000\",\"域\":\"000\"},\"用户\":{\"id\":\"000\",\"名称\":\ "000\"},\"channel\":{\"id\":\"000\",\"name\":\"000\"},\"callback_id\":\"rm_create\", \"trigger_id\":\"000\",\"message_ts\":\"000\",\"message\":{\"bot_id\":\"000\",\"type\":\ "消息\",\"文本\":\"000\",\"用户\":\"000\",\"ts\":\"000\",\"团队\":\"000 \"},\"response_url\":\"000\"}

在 C# 中创建的类

public partial class SlackResponse
{
    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("token")]
    public string Token { get; set; }

    [JsonProperty("action_ts")]
    public string ActionTs { get; set; }

    [JsonProperty("team")]
    public Team Team { get; set; }

    [JsonProperty("user")]
    public Channel User { get; set; }

    [JsonProperty("channel")]
    public Channel Channel { get; set; }

    [JsonProperty("callback_id")]
    public string CallbackId { get; set; }

    [JsonProperty("trigger_id")]
    public string TriggerId { get; set; }

    [JsonProperty("message_ts")]
    public string MessageTs { get; set; }

    [JsonProperty("message")]
    public Message Message { get; set; }

    [JsonProperty("response_url")]
    public Uri ResponseUrl { get; set; }
}

public partial class Channel
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }
}

public partial class Message
{
    [JsonProperty("client_msg_id")]
    public Guid ClientMsgId { get; set; }

    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("text")]
    public string Text { get; set; }

    [JsonProperty("user")]
    public string User { get; set; }

    [JsonProperty("ts")]
    public string Ts { get; set; }

    [JsonProperty("team")]
    public string Team { get; set; }
}

public partial class Team
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("domain")]
    public string Domain { get; set; }
}

和控制器方法

[HttpPost]
public async void Get([FromForm(Name = "payload")] SlackResponse payload)
{
}

【问题讨论】:

  • @John 如果使用字符串作为方法的输入参数,那么字符串将为:payload={\"type\":\"message_action\",\"token\":\"000\",\"action_ts\":\"000\",\"team\":{\"id\":\"000\",\"domain\":\"000\"},\"user\":{\"id\":\"000\",\"name\":\"000\"},\"channel\":{\"id\":\"000\",\"name\":\"000\"},\"callback_id\":\"rm_create\",\"trigger_id\":\"000\",\"message_ts\":\"000\",\"message\":{\"bot_id\":\"000\",\"type\":\"message\",\"text\":\"000\",\"user\":\"000\",\"ts\":\"000\",\"team\":\"000\"},\"response_url\":\"000\"}
  • 字符串中包含文本payload=?
  • 哎呀。复制的时候忘记删除,不是字符串不包含payload=
  • 那么您可能需要[FromBody],而不是[FromForm],因为您接收的是 JSON 而不是表单编码的数据。
  • 这个请求是否来自 Slack 的 API?如果是这样,那就太奇怪了。他们对 JSON 进行了编码,然后将其作为表单字段提供给表单帖子。鉴于您收到的实际数据,我倾向于认为您的解决方案是最好的。

标签: c# asp.net-web-api slack-api


【解决方案1】:

好像在asp.net coreFromForm is not support serialization中,最简单的解决方案是这样的

[HttpPost]
public async void Get([FromForm(Name ="payload")] string jsonString)
{
    var payload= JsonConvert.DeserializeObject<SlackResponse>(jsonString);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 2017-10-18
    相关资源
    最近更新 更多