【问题标题】:How to make GET request with a complex object?如何使用复杂对象发出 GET 请求?
【发布时间】:2018-10-17 07:46:17
【问题描述】:

我尝试使用复杂对象通过 WebApi 发出 GET 请求。 请求是这样的:

[HttpGet("{param1}/{param2}")]
public async Task<IActionResult> GetRequest(string param1, int param2, [FromBody] CustomObject[] obj)
{
    throw new NotImplementException();
}

CustomObject 在哪里:

[DataContract]
public class CustomeObject
{        
    [DataMember]
    public string Name { get; set; }
    [DataMember]
    public string Email { get; set; }
}

如何编写有效的 GET 请求?

【问题讨论】:

标签: c# asp.net-core asp.net-core-webapi


【解决方案1】:

[FromBody] CustomObject[] obj ... GET 请求没有消息正文,因此您应该将其更改为 FromUri

好的,看看Documentation

public class GeoPoint
{
    public double Latitude { get; set; } 
    public double Longitude { get; set; }
}

public ValuesController : ApiController
{
    public HttpResponseMessage Get([FromUri] GeoPoint location) { ... }
}

请求如下所示,本质上您将整个对象数据作为查询字符串传递

http://localhost/api/values/?Latitude=47.678558&Longitude=-122.130989

对象数组示例可以在另一篇帖子pass array of an object to webapi中找到

【讨论】:

  • 你能写一个示例请求来测试这个吗?
  • 它有助于单个对象。 OP 有一个数组。尝试展示这一点
  • 还要重新检查针对 asp.net-core 的操作,它不再使用 HttpResponseMessage
  • @Nkosi,这不会影响任何事情,可以更改返回类型,但工作保持不变(即参数绑定)。所以这个例子很清楚
  • 它确实会影响响应。但我明白你在说什么。在此处查看文档以帮助您回答docs.microsoft.com/en-us/aspnet/core/mvc/models/…
【解决方案2】:

如果您的复杂对象是由服务器定义的,您可以通过 URI 对其进行模型绑定,并在路由模板中标记属性。我的建议是将此模型保持在一个属性级别。您可以绑定到更复杂的对象,但很快就会发现自己必须编写自己的模型绑定器。

请注意,您的参数装饰器需要更改为 [FromUri] 才能通过 Uri 绑定复杂对象。服务器不需要支持 GET 主体,大多数不支持。

public class CustomObject
{ 
    public string Name { get; set; }
    public string Email { get; set; }
}

[HttpGet]
[Route("{foo.Name}/{foo.Email}")]
public HttpResponseMessage Get([FromUri]CustomObject foo)
{
   //...body
  return Request.CreateResponse(HttpStatus.OK, foo);
} 

【讨论】:

    【解决方案3】:

    您可以将其作为字符串化的 json 传递,或者通过 post 而不是 get 使用请求正文。

    【讨论】:

    • 不,不要将post 用于get 操作,尽管其他建议是有意义的
    • 是的,显然你不应该使用 POST 作为 GET,它在技术上是在谈论解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2013-10-20
    • 2018-08-25
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多