如何从邮递员传递字节数组

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.

  1. 如果您使用 JSON.NET,您可以 post clientIddtNameappend 来自 query and post dtValues from body 如下所示(确保你的控制器声明为 [ApiController]):

  1. 如果使用 System.Text.Json,使用 Sytem.Text.Json 字节数组 (byte[]) 将被序列化为 base64 字符串。他们表示他们不会添加对 byte[] 的支持以在 github issue.
  2. 中序列化为数字数组

自定义 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.NETSystem.Text.Json都支持接收IFormFile,这里不需要自定义JsonConverter:

[Route("Upload")]
public IActionResult Upload(int clientId, string dtName, [FromForm]IFormFile dtValues, bool append)
{
        return Ok();
}

Post 数据如下:

如果你不想分开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。