首页 文章

postman 文件和 json 返回 415,即使Header .net 核心

提问于
浏览
0

我正在使用邮递员测试我的.net 核心 API,当我试图通过 postman form-data 发布数据时,即使我将 Content-Type 标头设置为 application/json,这也会返回 415,因为此问题的常见解决方案似乎在线。如果我通过 raw postman 选项触发没有任何文件的请求并将内容类型设置为 JSON(application/json),则此请求将成功到达 API。

以下是我的 API 的外观:

[HttpPost("{organization}")]
    public IActionResult Post([FromBody] Asset asset, string organization)
    {
       //Api body
       //Get files from request
       Task uploadBlob = BlobFunctions.UploadBlobAsync(_blobContainer,Request.Form.Files[0]);
    }

以下是失败的邮递员请求的样子
在此输入图像描述

以及该请求的标头

在此输入图像描述

我还缺少什么才能工作?

小更新

如果我删除[FromBody]Asset asset并只传递文件,这工作正常

2 回答

  • 1

    尝试使用[1]属性而不是[2]属性:

    [HttpPost("{organization}")]
        public IActionResult Post([FromForm] string asset, string organization, IFormFile fileToPost)
        {
           //Api body
           Asset asset = JsonConvert.DeserializeObject<Asset>(asset);
           //Get files from request
           Task uploadBlob = BlobFunctions.UploadBlobAsync(_blobContainer, fileToPost);
        }
    

    我不能肯定地说,但我的猜测是,在 postman 中,因为你正在发出一个 form-data 请求,你的 content-type 最终会变成“multipart/form-data”(如果你在处理它时调试请求,你可以看到即使您将其设置为 application/json,内容类型也会更改为 multipart。

    但是在 Controller 的 POST 操作中,您指定期望来自正文的 Asset 对象(默认情况下需要 JSON 对象)。所以你得到一个 415,因为你的请求的内容类型是多部分,而你的 API 期望 application/json,因为你使用了[5]属性。

  • 0

    事实证明,由于一些奇怪的原因,我不允许将它们中的任何一个作为我的控制器的变量传递,但如果我从Request中检索它们,它就可以工作。

    if (!Request.Form.ContainsKey("asset"))
     {
        return BadRequest("Asset cannot be empty");
     }
     Asset asset = JsonConvert.DeserializeObject<Asset>(Request.Form.First(a => a.Key == "asset").Value);
    

    并为文件

    var file = equest.Form.Files[0]
    

    不知道为什么会这样,如果有人可以向我解释这一点,我会很感激,但这似乎解决了我的问题。

相关问题