即使使用 Content-Type Header .net core,邮递员文件和 json 也会返回 415

Posted

技术标签:

【中文标题】即使使用 Content-Type Header .net core,邮递员文件和 json 也会返回 415【英文标题】:Postman file and json returns 415 even with Content-Type Header .net core 【发布时间】:2017-05-30 11:02:14 【问题描述】:

我正在使用邮递员测试我的 .net 核心 API,当我尝试通过邮递员表单数据发布数据时,即使我将 Content-Type 标头设置为 application/json 作为通用解决方案,它也会返回 415问题似乎在线。 如果我通过原始邮递员选项触发没有任何文件的请求并将内容类型设置为 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 并只传递文件,这会正常工作

【问题讨论】:

【参考方案1】:

尝试使用 [FromForm] 属性而不是 [FromBody] 属性:

 [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);
    

我不能肯定地说,但我的猜测是,在邮递员中,由于您正在发出表单数据请求,因此您的内容类型最终将是“multipart/form-data”(如果您调试在处理请求时,您可以看到内容类型更改为多部分,即使您将其设置为 application/json)。

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

【讨论】:

非常感谢您的解释,这很有意义。我已经检查过了,它已经工作了。【参考方案2】:

事实证明,由于某种奇怪的原因,我不允许将它们中的任何一个作为控制器的变量传递,但如果我从 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]

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

【讨论】:

以上是关于即使使用 Content-Type Header .net core,邮递员文件和 json 也会返回 415的主要内容,如果未能解决你的问题,请参考以下文章

Angular 6:无法正确设置 http Header 的 Content-Type

PHP 使用header函数设置HTTP头的示例解析 表头

从content-type设置看Spring MVC处理header的一个坑

如何设置 WebClient Content-Type Header?

`header("Content-type:application/json");`的用法

即使在激活 GD 库后,imagettftext() 也无法正常工作