我有来自uri的Get WebApi的复杂对象,
在WebApi,
Public IHttpActionresult GetData([FromUri]ComplexModel model)
{
//some code
}
public class ComplexModel
{
public int Id {get; set;}
public string name {get; set;}
}
在MVC,
Public void CallWebApi()
{
using(HttpClient client = new HttpClient())
{
var uri = baseApi + "Contoller/GetData?Id=1&name=testname";
var response = client.GetAsync(uri).Result;
}
}
不是通过查询字符串传递复杂对象,而是有更好的方法吗?
答案 0 :(得分:0)
如果您需要使用HTTP GET
方法,那么您没有其他选择(除了将这些参数传递到某个HTTP标头之外,我认为这不是一个好的选择)。
为了简化端点URI的创建,您可以创建一个静态方法,将对象序列化为查询字符串。
这样的事情应该有效(taken from this answer):
public string GetQueryString(object obj) {
var properties = from p in obj.GetType().GetProperties()
where p.GetValue(obj, null) != null
select p.Name + "=" + HttpUtility.UrlEncode(p.GetValue(obj, null).ToString());
return String.Join("&", properties.ToArray());
}
以这种方式使用它:
ComplexModel myModel = GetMyModel();
using(HttpClient client = new HttpClient())
{
var uri = baseApi + "Contoller/GetData?" + GetQueryString(myModel);
var response = await client.GetAsync(uri);
}
顺便说一句:请记住永远不要调用异步方法,然后以同步方式等待结果,this could lead to deadlocks。