我正在使用邮递员来测试我的.net核心API,当我尝试通过邮递员表单发布数据时,即使我将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
并只传递文件
答案 0 :(得分: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);
}
我不能肯定地说,但我的猜测是,在postman中,因为你正在制作一个表单数据请求,你的内容类型最终将成为“multipart / form-data”(如果你调试了在处理它时,您可以看到内容类型更改为multipart,即使您将其设置为application / json)。
但是在Controller的POST操作中,您指定期望来自正文的Asset对象(默认情况下需要JSON对象)。所以你得到一个415因为你的请求的内容类型是multipart而你的API需要application / json,因为你使用了[FromBody]属性。
答案 1 :(得分: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]
不确定为什么会出现这种情况,如果有人能向我解释这一点,我会很感激,但这似乎解决了我的问题。