我有一个 WebAPI 端点,用于接收通用对象。
[HttpPost]
[ApiRoute("endpoint/{type}")]
public IHttpActionResult MyPostEndpoint(TypeEnum type, [FromBody] object myObject){}
我们一般处理该对象,但最终将其转换为我们的对象类型,但是当我们这样做时,我们必须首先将其转换为 JObject,因此抓取对象如下所示:
var myfoo = ((JObject) object).ToObject<Foo>();
如果我直接提供 Foo 作为 POST 参数(例如
[FromBody] Foo myObject
),那么它会将传入的 JSON 反序列化为 Foo,但不会反序列化为通用 C# 对象。有没有办法让它反序列化为通用 C# 对象,而不是将其保留为 JObject,这样我就可以像这样获取 myfoo?
var myfoo = (Foo) object;
我将此代码用于返回数据的通用 post 方法。然后你可以传递任何类,这样请求就更通用了。
public class Requests
{
//...
public async Task<ResultType> Create<ResultType>(string uri)
{
//TODO implementation of httpclient POST logic go here
var data = await results.Content.ReadAsStringAsync();
var result = JsonConvert.DeserializeObject<ResultType>(data);
return result;
}
调用方法
List<foo> foos = new List<foo>();
Request requestToServer = new request();
Task.WaitAll(Task.Run(async =>(){
foos = await requestToServer.Create<Foo>("/foo");
}));
现在您可以通过任何预定义的课程
我认为你可以像下面这样做来获得松散类型的方法
public static class HttpRequestHelper
{
public static async Task<T> GetDataModelFromRequestBodyAsync<T>(HttpRequestMessage req)
{
dynamic requestBody = await req.Content.ReadAsStringAsync();
object blobModelObject = JsonConvert.DeserializeObject<object>(requestBody);
var blobModel = ((JObject)blobModelObject).ToObject<T>();
return blobModel;
}
}
使用方法如下:
var blobModel = await HttpRequestHelper.GetDataModelFromRequestBodyAsync<RequestBlobModel>(req);
希望这有帮助
.NET CLI
dotnet new web --name "GenericEndpointExample"
cd GenericEndpointExample
dotnet add package SingleApi
程序.cs:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
// map generic endpoint
app.MapSingleApi("sapi",
// add your generic request handler
// for example, return the received data (already typed object)
x => Task.FromResult(x.Data),
// add assemblies for resolving received data types
typeof(MyClassName).Assembly, typeof(List<>).Assembly, typeof(int).Assembly);
app.Run();
类型请求示例:MyClassName
POST /sapi/MyClassName
{"Name":"Example"}
通用请求示例:字典
POST /sapi/Dictionary(String-Array(Nullable(Int32)))
{"key1":[555,null,777]}