当前位置: 首页 > 知识库问答 >
问题:

API控制器POST方法多部分/表单数据,使用主体内部的边界获取消息

穆鸿卓
2023-03-14

我在API控制器上开发C#(.NET5)方法时遇到困难,因为API控制器可以管理具有“多部分/表单数据”的请求;边界=边界'

我不能在客户端更改请求,我只能修改后端以适应它。

请求指定“内容类型:多部分/表单数据;boundary=boundary',它的主体内有一条json消息,我需要提取该消息。

在请求主体内,消息如下所示:

--boundary
Content-Disposition: form-data; name="ZZZZZZZZZZ"
Content-Type: application/json
Content-Length: 474

{
    //a well formed json
}
--boundary--

我可以使用以下代码:string dataMessage=new StreamReader(请求。身体)。ReadToEndAsync().结果;

然后,我可以使用IndexOf和Substring手动解析该字符串以仅提取json部分,然后使用JsonConvert将其转换为对象。

我想知道是否有一些选择。Net自动执行此操作,而无需手动解析字符串。我认为必须有某种方法来解释边界标记并直接获取json数据。但是我没有发现任何问题,因为当使用webhook.site测试客户端请求时,它可以毫无问题地解析消息。

我的控制器定义如下

[ApiController]
[Route("api/[controller]")]
public class XXXXController : ControllerBase

而方法是这样的

[HttpPost]
[Route("[action]")]
public IActionResult YYYYYYY()

我已经尝试指定模型绑定来改变行为,但是我不能让它工作。

在询问之前,我已经搜索了“帮助”:

  • https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding?view=aspnetcore-5.0#http get请求的模型绑定

谢谢你的帮助!!

共有1个答案

徐奇逸
2023-03-14

没有内置的多部分/表单数据的支持。默认情况下为Net5。因此,输入格式化程序应该附加到MvcBuilder

考虑到您不能操作客户端,可以使用支持这种输入格式的ApiMultipartFormDataFormatter。

  1. 添加包:

安装软件包ApiMultipartFormDataFormatter-版本3.0.0

启动中配置格式化程序。cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =>
    {
        options.InputFormatters.Add(new MultipartFormDataFormatter());
    });
}

假设上述格式良好的json类似于下面的类:

public class CustomContent
{
    public string Name { get; set; }
}

因此,我们需要将其包装到另一个类中,该类包含此参数。注意:到目前为止,库不支持反序列化。因此,将向返回反序列化对象的模型添加纯getter属性。

public class ViewModel
{
    // Equivalent to ZZZZZZZZZZ
    public string SerializedContent { get; set; }
    public CustomContent Content => !string.IsNullOrEmpty(SerializedContent)
        ? JsonConvert.DeserializeObject<CustomContent>(SerializedContent)
        : null;
}

改革操作以接受包装器模型。

[HttpPost]
[Route("[action]")]
public IActionResult Parse(ViewModel vm)
{            
    return Ok($"Received Name: {vm?.Content?.Name}");
}

相应示例的工作cURL请求为:

curl --location --request POST 'http://localhost:25599/api/MultiPart/Parse' 

\
--header 'Content-Type: multipart/form-data; boundary=boundary' \
--data-raw '--boundary
Content-Disposition: form-data; name="SerializedContent"
Content-Type: application/json
Content-Length: 100

{
    "Name" : "Foo"
}
--boundary--'

响应应该等于接收名称:Foo

 类似资料:
  • 没有边界的多部分/表单数据请求是否有效?根据规范,当有超过1个部分时,使用边界将它们分开(并且该边界不应该是身体的一部分)。我有一个请求,其中有一个单一的主体作为原始内容或文件,在内容类型中,我们传递“多部分/表单数据”。这种要求实际上有效吗?

  • 无论我怎么努力,似乎都无法解决这个问题。我正在提交此curl命令: 我有一个带有注释@RestController的Spring Boot 1.4应用程序,方法如下: filedata变量始终为null,请求对象始终显示0个文件。 我已经尝试了MultipartResolver的多种配置。这是我的最新消息: 我也在我的应用程序中手动粘贴了这些。属性,以确保其未被禁用: Springhttp。多部分

  • 问题内容: 我有一个表单数据以及要在同一POST中发送的文件。例如,{duration:2000,file:test.wav}。我在这里看到了许多关于使用python请求发布多部分/表单数据的线程。 我的样品要求如下: 但是,当我执行上面的代码时,出现此错误: 5:59:55.338 Dbg 09900 [DEBUG]解决处理程序[null]中的异常:org.springframework.web

  • 我收到第三方对我的laravel post API的请求,其中包含两个表单数据(ID、文件)和标题(内容类型多部分/表单数据) 在laravel控制器中,在

  • 我有个问题,但我看不出我做错了什么?我想用最简单的方法来实现这一点,稍后我会让它变得更复杂,但现在我只想点击post方法,我甚至不在乎里面的代码当前是否正常工作。 我唯一关心的是它会发回一个OK 200的回复。 目前,我收到一个内部服务器错误500响应或405方法不允许响应,具体取决于我是尝试发送数据还是仅使用浏览器强制方法调用。 有一个IOS应用程序发送下面的post请求,我有一个测试PHP脚本

  • 我正在向webapi控制器发送多部分数据。如何阅读方法中的内容?