如何使用复杂对象进行GET请求?

9

我尝试通过 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请求?

如果您能展示一下您客户端代码的 [mcve],并展示一下您目前所尝试的内容,那将是非常棒的。 - mjwills
1
你在一个问题中问了太多的问题。此外,你的CustomObject并不复杂。 - SᴇM
调用该操作的URL会是什么样子? - Nkosi
一个GET请求没有消息体,因此无法将任何数据绑定为“FromBody”。 - Chris Pratt
3个回答

12

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

确保查看文档

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


你能否提供一个测试此功能的示例请求? - Admiral Land
它对于单个对象很有帮助。OP有一个数组,请尝试展示一下。 - Nkosi
请重新检查此操作,因为这是针对不再使用HttpResponseMessage的asp.net-core。 - Nkosi
@Nkosi,那不会影响任何事情,返回类型可以更改,但工作方式保持不变(即参数绑定)。因此,示例使其非常清晰。 - Rahul
虽然它确实会影响响应,但我明白你的意思。请查看此处的文档以帮助回答:https://learn.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-2.1 - Nkosi

3
如果您的复杂对象是由服务器定义的,则可以通过URI进行模型绑定,并在路由模板中使用点符号将属性标注。我的建议是将此模型保持在一级属性上。您可以绑定更复杂的对象,但很快就会发现自己需要编写自己的模型绑定器。
请注意,如果要通过URI绑定复杂对象,则需要将您的参数装饰器更改为[FromUri]。服务器不需要支持GET body,大多数服务器都不支持。
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);
} 

1
您可以将其作为字符串化的JSON传递,也可以使用请求正文通过POST而不是GET。

1
不,不要在get操作中使用post,尽管其他建议是有道理的。 - Rahul
1
当然,你不应该将POST用作GET,这在技术上是错误的解决方案。 - Marco Salerno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接