如何在POST请求中发送JSON字符串参数至后端接口?
解决方案
1. 修正Payload转义与请求Content-Type
问题核心在于两个错误:一是误用了application/json-patch+json作为请求类型(该类型专用于JSON Patch操作),二是curl请求中Payload的双引号未完成正确转义。
正确的curl请求
将Content-Type改为标准的application/json,同时确保Payload内部的双引号做双重转义(因整个请求体被双引号包裹):
curl -X POST "http://localhost:5110/api/InboundData" -H "accept: */*" -H "Content-Type: application/json" -d "{ \"key\": \"test\", \"payload\": \"[{\\\"IDNew\\\":1,\\\"NameNew\\\":\\\"t1\\\",\\\"DescriptionNew\\\":\\\"t1d\\\", \\\"IntegerValueNew\\\":1, \\\"DecimalValueNew\\\":123.3}]\"}"
标准JSON格式(手动测试用)
若直接使用JSON文件发送,正确格式应为:
{ "key": "test", "payload": "[{\"IDNew\":1,\"NameNew\":\"t1\",\"DescriptionNew\":\"t1d\", \"IntegerValueNew\":1, \"DecimalValueNew\":123.3}]" }
2. 配置Swagger禁止解析Payload内容
如果使用Swashbuckle(.NET Swagger库),可通过属性标记明确告知Swagger将Payload视为纯字符串,避免自动解析:
using Swashbuckle.AspNetCore.Annotations; [Required] [JsonProperty(Required = Required.DisallowNull)] [MaxLength(100)] public string Key { get; set; } [Required] [JsonProperty(Required = Required.DisallowNull)] [SwaggerSchema(Format = "string", Description = "JSON格式字符串,将在服务端根据Key解析")] public string Payload { get; set; }
也可添加全局Schema过滤器,强制指定Payload的类型为字符串:
services.AddSwaggerGen(c => { c.SchemaFilter<PayloadStringFilter>(); }); public class PayloadStringFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { if (context.Type == typeof(你的数据模型类名)) { schema.Properties["payload"].Format = "string"; schema.Properties["payload"].Type = "string"; } } }
3. 备选方案:Base64编码Payload
若转义问题反复出现,可将Payload的JSON字符串转为Base64编码,彻底避免解析器误识别:
- 客户端:将
[{"IDNew":1,"NameNew":"t1",...}]转为Base64字符串,示例:W3siSUROZXciOjEsIk5hbWVOZXciOiJ0MSIsIkRlc2NyaXB0aW9uTmV3IjoidDFkIiwgIkludGVnZXJWYWx1ZU5ldyI6MSwgIkRlY2ltYWxWYWx1ZU5ldyI6MTIzLjN9XQ== - 发送的JSON:
{ "key": "test", "payload": "W3siSUROZXciOjEsIk5hbWVOZXciOiJ0MSIsIkRlc2NyaXB0aW9uTmV3IjoidDFkIiwgIkludGVnZXJWYWx1ZU5ldyI6MSwgIkRlY2ltYWxWYWx1ZU5ldyI6MTIzLjN9XQ==" } - 服务端解码:
var payloadBytes = Convert.FromBase64String(model.Payload); var payloadJson = Encoding.UTF8.GetString(payloadBytes); // 后续根据Key解析payloadJson为对应对象
内容的提问来源于stack exchange,提问作者Redzix
相关产品推荐
相关产品推荐

