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

Posted

技术标签:

【中文标题】如何从邮递员传递字节数组【英文标题】:How to pass byte array from postman 【发布时间】:2021-06-18 13:50:29 【问题描述】:

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

邮递员电话

【问题讨论】:

作为 JSON 数组? [37, 80, ...] 我可以使用任何格式作为字节[]传递。 JSON 不代表二进制数据,因此本身不是字节数组。您可能希望建模为 int[] 而不是表示整数数组。 嗨@ArunSingh,我在下面分享了多个场景和解决方案。请检查。 【参考方案1】:

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

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

    如果您使用 JSON.NET,您可以从 query 发布 clientIddtNameappend 并从 body 发布 dtValues 如下所示(确保您的控制器使用[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());
); 

在 Postman 中测试:

顺便说一句,不确定您的方案是什么,如果您发布的字节数组类似于文件例如: 图像或.doc 或.xlx 文件),您可以使用IFormFile 并在参数前添加[FromForm]JSON.NETSystem.Text.Json都支持接收IFormFile,这里不需要自定义JsonConverter:

[Route("Upload")]
public IActionResult Upload(int clientId, string dtName, [FromForm]IFormFile dtValues, bool append)

        return Ok();

发布如下数据:

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

型号:

public class TestModel

    public int clientId  get; set; 
    public string dtName  get; set; 
    public byte[] dtValues  get; set; 
    public bool append  get; set; 

在邮递员中发帖:

注意:如果你使用System.Text.Json,你仍然需要像上面我分享的选项2那样自定义JsonConverter。

【讨论】:

伟大的研究!我的客户想要以文件格式或字节 [] 格式发送数据。所以我们必须提供两种选择。我可以使用文件,但不能使用 byte[]。我会试试你的答案/谢谢【参考方案2】:

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

dtValues : [37,80]

【讨论】:

以上是关于如何从邮递员传递字节数组的主要内容,如果未能解决你的问题,请参考以下文章

如何将字节数组从 c# 传递到 MFC ActiveX

如何将字节数组从android java类传递给JNI C NDK?

如何将字节数组一个活动传递给另一个android [重复]

如何使用 ODP.Net 传递字节数组?

如何通过引用从 c# 到 c++ 传递字节数组

通过邮递员发送二维字节数组(多个文件)作为多部分请求