我在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()
我已经尝试指定模型绑定来改变行为,但是我不能让它工作。
在询问之前,我已经搜索了“帮助”:
谢谢你的帮助!!
没有内置的多部分/表单数据的支持。默认情况下为Net5。因此,输入格式化程序应该附加到
MvcBuilder
。
考虑到您不能操作客户端,可以使用支持这种输入格式的ApiMultipartFormDataFormatter。
添加包:
安装软件包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控制器发送多部分数据。如何阅读方法中的内容?