如何从邮递员传递字节数组
How to pass byte array from postman
我正在开发一个 public API 用户将在参数中发送 byte[] 的地方。我已经实现了 API 方法并想对其进行测试,但如果我在邮递员中尝试,则无法发送字节 []。出现以下错误
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "|e1896d86-412b7762126469ae.",
"errors": {
"$": [
"The JSON value could not be converted to System.Byte[]. Path: $ | LineNumber: 0 | BytePositionInLine: 1."
]
}
}
API 方法参数
public IActionResult Upload(int clientId, string dtName, byte[] dtValues, bool append)
{
}
邮递员电话
你必须传递数组而不是字符串。
dtValues : [37,80]
首先,asp.net内核不支持post多个参数来自body,您需要 将这些参数放入模型中 然后您可以 post 它们来自 body.
那么,你所做的应该是 post 从查询。但是好像不支持byte[]
from query.
- 如果您使用 JSON.NET,您可以 post
clientId
、dtName
和 append
来自 query and post dtValues
from body 如下所示(确保你的控制器声明为 [ApiController]
):
- 如果使用
System.Text.Json
,使用 Sytem.Text.Json
字节数组 (byte[]
) 将被序列化为 base64 字符串。他们表示他们不会添加对 byte[]
的支持以在 github issue. 中序列化为数字数组
自定义 JsonConverter:
public class ByteArrayConverter : JsonConverter<byte[]>
{
public override byte[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
short[] sByteArray = JsonSerializer.Deserialize<short[]>(ref reader);
byte[] value = new byte[sByteArray.Length];
for (int i = 0; i < sByteArray.Length; i++)
{
value[i] = (byte)sByteArray[i];
}
return value;
}
public override void Write(Utf8JsonWriter writer, byte[] value, JsonSerializerOptions options)
{
writer.WriteStartArray();
foreach (var val in value)
{
writer.WriteNumberValue(val);
}
writer.WriteEndArray();
}
}
注册它:
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new ByteArrayConverter());
});
在Post人中测试:
顺便说一句,不确定你的场景是什么,如果你post字节数组类似于file(e.g: image or .doc or .xlx file),你可以使用IFormFile
并在参数前添加[FromForm]
。 JSON.NET
或System.Text.Json
都支持接收IFormFile
,这里不需要自定义JsonConverter:
[Route("Upload")]
public IActionResult Upload(int clientId, string dtName, [FromForm]IFormFile dtValues, bool append)
{
return Ok();
}
如果你不想分开post他们从查询和body,您可以 将它们放入模型 和 post 它们来自 body.
型号:
public class TestModel
{
public int clientId { get; set; }
public string dtName { get; set; }
public byte[] dtValues { get; set; }
public bool append { get; set; }
}
Post 在 Postman:
注意:如果你使用System.Text.Json
,你仍然需要像上面分享的选项2一样自定义JsonConverter。
我正在开发一个 public API 用户将在参数中发送 byte[] 的地方。我已经实现了 API 方法并想对其进行测试,但如果我在邮递员中尝试,则无法发送字节 []。出现以下错误
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "|e1896d86-412b7762126469ae.",
"errors": {
"$": [
"The JSON value could not be converted to System.Byte[]. Path: $ | LineNumber: 0 | BytePositionInLine: 1."
]
}
}
API 方法参数
public IActionResult Upload(int clientId, string dtName, byte[] dtValues, bool append)
{
}
邮递员电话
你必须传递数组而不是字符串。
dtValues : [37,80]
首先,asp.net内核不支持post多个参数来自body,您需要 将这些参数放入模型中 然后您可以 post 它们来自 body.
那么,你所做的应该是 post 从查询。但是好像不支持byte[]
from query.
- 如果您使用 JSON.NET,您可以 post
clientId
、dtName
和append
来自 query and postdtValues
from body 如下所示(确保你的控制器声明为[ApiController]
):
- 如果使用
System.Text.Json
,使用Sytem.Text.Json
字节数组 (byte[]
) 将被序列化为 base64 字符串。他们表示他们不会添加对byte[]
的支持以在 github issue. 中序列化为数字数组
自定义 JsonConverter:
public class ByteArrayConverter : JsonConverter<byte[]>
{
public override byte[] Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
{
short[] sByteArray = JsonSerializer.Deserialize<short[]>(ref reader);
byte[] value = new byte[sByteArray.Length];
for (int i = 0; i < sByteArray.Length; i++)
{
value[i] = (byte)sByteArray[i];
}
return value;
}
public override void Write(Utf8JsonWriter writer, byte[] value, JsonSerializerOptions options)
{
writer.WriteStartArray();
foreach (var val in value)
{
writer.WriteNumberValue(val);
}
writer.WriteEndArray();
}
}
注册它:
services.AddControllers().AddJsonOptions(options =>
{
options.JsonSerializerOptions.Converters.Add(new ByteArrayConverter());
});
在Post人中测试:
顺便说一句,不确定你的场景是什么,如果你post字节数组类似于file(e.g: image or .doc or .xlx file),你可以使用IFormFile
并在参数前添加[FromForm]
。 JSON.NET
或System.Text.Json
都支持接收IFormFile
,这里不需要自定义JsonConverter:
[Route("Upload")]
public IActionResult Upload(int clientId, string dtName, [FromForm]IFormFile dtValues, bool append)
{
return Ok();
}
如果你不想分开post他们从查询和body,您可以 将它们放入模型 和 post 它们来自 body.
型号:
public class TestModel
{
public int clientId { get; set; }
public string dtName { get; set; }
public byte[] dtValues { get; set; }
public bool append { get; set; }
}
Post 在 Postman:
注意:如果你使用System.Text.Json
,你仍然需要像上面分享的选项2一样自定义JsonConverter。