我有一个WebAPI端点,用于接收通用对象。
Timer.scheduledTimer(timeInterval: 10, target: self, selector: #selector(getTweets), userInfo: nil, repeats: true).
func getTweets() {
let locationName = Helper.sharedInstance.userDefault.value(forKey: ModelKey.currentLocation) as? String
let accessToken = Helper.sharedInstance.userDefault.value(forKey: ModelKey.twitterAccessToken) as? String
if (locationName == "Bengaluru" && nil != accessToken) || (locationName == "Bangalore" && nil != accessToken){
tweetModel.getTweets(accessToken: accessToken!, city: ModelKey.blrcitytraffic, cityName: "Bengaluru")
}
}
我们一般地处理对象,但最终将它转换为我们的对象类型,但是当我们这样做时,我们必须先将它转换为JObject,所以抓取对象看起来像这样:
[HttpPost]
[ApiRoute("endpoint/{type}")]
public IHttpActionResult MyPostEndpoint(TypeEnum type, [FromBody] object myObject){}
如果我直接提供Foo作为我的POST参数(例如var myfoo = ((JObject) object).ToObject<Foo>();
),那么它会将传入的JSON反序列化为Foo,但它不会反序列化为通用C#对象。有没有办法让它反序列化为一个通用的C#对象,而不是让它成为一个JObject,所以我可以这样得到myfoo?
[FromBody] Foo myObject
答案 0 :(得分:1)
作为返回数据的通用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");
}));
现在您可以传递任何预定义的类
答案 1 :(得分:0)
我认为您可以喜欢下面的方法来使用松散类型的方法
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);
希望有帮助