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

时间:2021-06-18 13:50:29

标签: .net asp.net-core postman webapi

我正在开发一个公共 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)
    {
 
}

邮递员电话

enter image description here

2 个答案:

答案 0 :(得分:0)

你必须传递数组而不是字符串。

dtValues : [37,80]

答案 1 :(得分:0)

首先,asp.net core不支持 post 多个参数 from body,你需要把这些参数放到一个模型中然后你就可以了从正文中发布它们。

然后,您所做的应该是从查询中发布的。但它似乎不支持 byte[] from query。

  1. 如果您使用 JSON.NET,则可以从 query 发布 clientIddtNameappend 并发布 {{ 1}} 来自 body,如下所示(确保您的控制器使用 dtValues 声明):

enter image description here

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

自定义 JsonConverter:

byte[]

注册:

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();
    }
}

在 Postman 中测试:

enter image description here

顺便说一句,不确定您的情况是什么,如果您发布字节数组类似于文件例如:< /strong> 图像或 .doc 或 .xlx 文件),您可以使用 services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.Converters.Add(new ByteArrayConverter()); }); 并在参数前添加 IFormFile[FromForm]JSON.NET 都支持接收 System.Text.Json,这里不需要自定义 JsonConverter:

IFormFile

发布如下数据: enter image description here

如果您不想单独查询正文中发布它们,您可以将它们放入模型中 strong> 并从正文中发布它们。

型号:

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

在邮递员中发布:

注意:如果您使用 public class TestModel { public int clientId { get; set; } public string dtName { get; set; } public byte[] dtValues { get; set; } public bool append { get; set; } } ,您仍然需要像上面我分享的选项 2 一样自定义 JsonConverter。

enter image description here