【问题标题】:ASP.NET Core 3.1 Web API - Create route with nullable parameterASP.NET Core 3.1 Web API - 使用可为空的参数创建路由
【发布时间】:2020-11-23 16:12:54
【问题描述】:

我有以下端点:

[Route("{id}/copy")]
[HttpPost]
public ActionResult<CollectionView> Copy(long id, CollectionView? collectionView = null)
{

我希望能够通过为collectionViewnull 提供值来调用此端点。

但是,在我调用此端点的集成测试中,如果我不提供正文,服务器会返回 415 Unsupported Media Type。

//works
var copy = await PostAsync<CollectionView>($"{ApiBase}/{retValue.Id}/copy", new CollectionView { Name = "New Name" });

//415 unsupported media type
var copy = await PostAsync<CollectionView>($"{ApiBase}/{retValue.Id}/copy");

我尝试在 CollectionView? 参数上指定 [FromForm],正如我在其他地方看到的那样,但它无法解析我在第一次集成测试中提供的视图,所有值都为 null。

如何正确配置我的 API 端点以具有可选的正文参数?

【问题讨论】:

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


    【解决方案1】:

    您必须使用[FromBody] 而不是[FromForm]

    [Route("{id}/copy")]
    [HttpPost]
    public ActionResult<CollectionView> Copy(long id, [FromBody]CollectionView? collectionView = null)
    

    [FromForm] 仅在发送 multipart/form-data 时有效

    【讨论】:

      【解决方案2】:

      据我所知,asp.net core web api 支持空参数。但是您的代码不起作用的原因与您的 postasnyc 方法有关。

      由于 Copy 方法需要 application/json 作为请求类型,因此您的 postasny 方法没有设置正确的请求类型,这就是您收到 415 错误的原因。

      为了解决这个问题,我建议你可以尝试修改不包含 CollectionView 的 PostAsync 方法来发送application/json 请求。

      更多细节,您可以参考以下代码:

      由于我不知道你的 postasync 方法,所以我使用了 rest 客户端。

      var client = new RestClient("https://localhost:5001/api/values/22/copy");
      var request = new RestRequest(Method.POST);
      request.AddHeader("Cache-Control", "no-cache");
      request.AddHeader("Content-Type", "application/json");
      request.AddParameter("undefined", "{}", ParameterType.RequestBody);
      IRestResponse response = client.Execute(request);
      

      【讨论】:

        猜你喜欢
        • 2019-04-07
        • 2022-08-15
        • 1970-01-01
        • 2019-09-29
        • 2018-08-28
        • 1970-01-01
        • 2020-10-31
        • 2021-01-26
        • 2018-08-25
        相关资源
        最近更新 更多