api - 无法从端点参数中读取数据,只能读取 TokenType 和 ValueKind
问题描述
我正在尝试设置 webhook 并在我的端点中接收有效负载。有效负载通过 http 发送(作为 json 格式)到我的端点,在其中我通过端点操作中的参数拦截有效负载请求体。只有当我将有效负载的类型设置为“对象”时,才会触发该操作。我尝试使用 JSON 有效负载创建 1 对 1 映射的模型;我什至确保它区分大小写。
当我使用我的自定义类(具有相应的属性)作为 [FromBody] 动作参数时,它不会被触发。当我使用“对象”参数类型时,它会被触发,但我无法访问任何数据。我还尝试使用 NewtonSoft.JSON 将对象转换为 JObject,但这仅返回 ValueKind 属性(在检查传入对象时也可见)。
如何将数据从有效负载映射到我的自定义对象?或者为什么当我使用与对象参数相反的自定义模型时端点没有触发?
使用对象作为参数时的端点
[AllowAnonymous]
[HttpPost("{userId}/follows")]
public void HandleReceivedFollow([FromRoute(Name = "userId")] string userId, [FromBody] object response)
{
Console.WriteLine(response);
//PROCESS DATA AND SEND OVER WSS
}
使用我的自定义类作为参数时的端点
[AllowAnonymous]
[HttpPost("{userId}/follows")]
public void HandleReceivedFollow([FromRoute(Name = "userId")] string userId, [FromBody] TwitchResponse<UserFollowResponse> response)
{
Console.WriteLine(response);
//PROCESS DATA AND SEND OVER WSS
}
有效负载以以下形式从 webhook 发送:
{
"data":
{
"field1": 0,
"field2": 1
}
}
我的自定义类看起来像:
抽搐响应
public class TwitchResponse<T> : ITwitchResponse<T>
{
public T data { get; set; }
public TwitchResponse() { }
public TwitchResponse(T data)
{
this.data = data;
}
}
用户关注响应
public class UserFollowResponse
{
public string from_id { get; set; }
public string from_name { get; set; }
public string to_id { get; set; }
public string to_name { get; set; }
public string followed_at { get; set; }
public UserFollowResponse() { }
public UserFollowResponse(string from_id, string from_name, string to_id, string to_name, string followed_at)
{
this.from_id = from_id;
this.from_name = from_name;
this.to_id = to_id;
this.to_name = to_name;
this.followed_at = followed_at;
}
}
当我使用对象参数时,我在端点收到的有效负载:
ValueKind = Object : "{"data":[{"followed_at":"2020-07-07T11:38:16Z","from_id":"70700448","from_name":"HetDiamondSword","to_id":"166294598","to_name":"RamonPeekFifa"}]}"
解决方案
我看了一下这个 JSON:
{
"data":[
{
"followed_at":"2020-07-07T11:38:16Z",
"from_id":"70700448",
"from_name":"HetDiamondSword",
"to_id":"166294598",
"to_name":"RamonPeekFifa"
}
]
}
看起来“数据”元素是一个数组。
您可以修改您的操作,使其看起来像这样:
[AllowAnonymous]
[HttpPost("{userId}/follows")]
public void HandleReceivedFollow([FromRoute(Name = "userId")] string userId, [FromBody] TwitchResponse<IEnumerable<UserFollowResponse>> response)
{
Console.WriteLine(response);
//PROCESS DATA AND SEND OVER WSS
}
让我们知道是否有任何变化?
推荐阅读
- mysql - 事务方法不在数据库上写入更新
- javascript - 在茉莉花测试和 TypeError 中模拟“管道”:无法读取未定义的属性“管道”
- xamarin.forms - Xamarin.Forms 如何在 App 的所有页面上添加背景图片
- swift - SwiftUI Mac OS DatePicker 在编辑时跳回一天
- php - 当会话 cookie 在 Laravel 中过期时重新加载站点
- c# - TradingView/Binance 指标的历史数据
- javascript - 追加一个字符N次的最快方法
- python - 使用 @numpy.vectorize 在 pandas 中减去 2 个 datetime64 列
- java - 有什么方法可以在 WIre Mock 中测试数组类型查询参数
- android - 禁用 VrPanoramaView 淡入