带有附件和常规字段的POST C#

带有附件和常规字段的POST C#,c#,json,C#,Json,我用的是C 我有几个问题: 我想知道使用附件发出HTTP请求的“最佳”方式是什么 我可以发送一个字典:{{“FileName”:“a.txt”,FileBase64Stream:“SOME BASE 64 STRING”},{“FileName”:“b.txt”,FileBase64Stream:“SOME BASE 64 STRING”} 或者有其他方式发送附件 我想将常规对象(int、string等)作为json发送,我是通过以下方式发送的: {{“value”:“1.2”,“type”:“

我用的是C

我有几个问题:

  • 我想知道使用附件发出HTTP请求的“最佳”方式是什么

    我可以发送一个字典:{{“FileName”:“a.txt”,FileBase64Stream:“SOME BASE 64 STRING”},{“FileName”:“b.txt”,FileBase64Stream:“SOME BASE 64 STRING”}

    或者有其他方式发送附件

  • 我想将常规对象(int、string等)作为json发送,我是通过以下方式发送的:

    {{“value”:“1.2”,“type”:“float”},{“value”:“1”,“type”:“int”},{“value”:“Hello”,“type”:“string”},{“value”:“0001111010101”,“type”:“bytes”}

  • 但是在这种情况下,客户机需要根据类型转换值,还有另一种方法可以将“general”对象作为JSON发送并解析它吗


    Thakns

    虽然Base64编码对于较小的有效负载可能很好,但对于较大的文件,它会增加太多开销。我建议您改用中定义的,因为它允许您直接将文件作为二进制流发送。大多数服务器端API框架本机支持
    多部分/表单数据
    编码请求。下面是一个有效负载示例:

    POST /upload HTTP/1.1
    Host: example.com
    Content-Type: multipart/form-data, boundary=AaB03x
    
    --AaB03x
    Content-Disposition: form-data; name="file1"; filename="a.txt"
    Content-Type: text/plain
    
    contents of a.txt come here
    --AaB03x
    Content-Disposition: form-data; name="file2"; filename="b.txt"
    Content-Type: text/plain
    
    contents of b.txt come here
    --AaB03x--
    
    关于反序列化泛型对象的第二个问题,该包允许您编写一个自定义JsonConverter来处理这种情况。您可以从对数据建模开始:

    public class MyModel
    {
        public object Value { get; set; }
    
        public string Type { get; set; }
    }
    
    然后写一个转换器来处理它:

    public class MyConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(MyModel);
        }
    
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            if (reader.TokenType == JsonToken.Null)
            {
                return null;
            }
    
            var json = JObject.Load(reader);
            JToken typeToken;
            JToken valueToken;
            if (json.TryGetValue("type", StringComparison.InvariantCultureIgnoreCase, out typeToken) &&
                json.TryGetValue("value", StringComparison.InvariantCultureIgnoreCase, out valueToken))
            {
                string type = typeToken.Value<string>().ToLowerInvariant();
                var model = new MyModel();
                model.Type = type;
                switch (type)
                {
                    case "float":
                        model.Value = valueToken.Value<float>();
                        break;
                    case "int":
                        model.Value = valueToken.Value<int>();
                        break;
                    case "string":
                        model.Value = valueToken.Value<string>();
                        break;
                    case "bytes":
                        string input = valueToken.Value<string>();
                        int count = input.Length / 8;
                        byte[] bytes = new byte[count];
                        for (int i = 0; i < count; ++i)
                        {
                            bytes[i] = Convert.ToByte(input.Substring(8 * i, 8), 2);
                        }
                        model.Value = bytes;
                        break;
                    default:
                        throw new NotSupportedException("The specified type is not supported: " + type);
                }
    
                return model;
            }
    
            return null;
        }
    
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }
    
    公共类MyConverter:JsonConverter
    {
    公共覆盖布尔CanConvert(类型objectType)
    {
    返回objectType==typeof(MyModel);
    }
    公共重写对象ReadJson(JsonReader阅读器,类型objectType,对象existingValue,JsonSerializer序列化程序)
    {
    if(reader.TokenType==JsonToken.Null)
    {
    返回null;
    }
    var json=JObject.Load(读卡器);
    JToken-typeToken;
    jtokenvaluetoken;
    if(json.TryGetValue(“type”,StringComparison.InvariantCultureIgnoreCase,out-typeToken)&&
    TryGetValue(“value”,StringComparison.InvariantCultureIgnoreCase,out valueToken))
    {
    字符串类型=typeToken.Value().ToLowerInvariant();
    var模型=新的MyModel();
    model.Type=Type;
    开关(类型)
    {
    案例“浮动”:
    model.Value=valueToken.Value();
    打破
    案例“int”:
    model.Value=valueToken.Value();
    打破
    大小写“字符串”:
    model.Value=valueToken.Value();
    打破
    大小写“字节”:
    字符串输入=valueToken.Value();
    int count=输入长度/8;
    字节[]字节=新字节[计数];
    对于(int i=0;i
    现在只剩下在反序列化时使用此转换器:

    string json =
    @"[{
        ""value"": 1.2,
        ""type"": ""float""
      }, {
        ""value"": 1,
        ""type"": ""int""
      }, {
        ""value"": ""Hello"",
        ""type"": ""string""
      }, {
        ""value"": ""00011111010101"",
        ""type"": ""bytes""
      }]";
    var myConverter = new MyConverter();
    var models = JsonConvert.DeserializeObject<IList<MyModel>>(json, myConverter);
    
    stringjson=
    @"[{
    “值”:1.2,
    “”类型“”:“”浮点“”
    }, {
    “值”:1,
    “”类型“”:“”int“”
    }, {
    “值”:“你好”,
    “”类型“”:“”字符串“”
    }, {
    “值”:“0001111010101”,
    “”类型“”:“”字节“”
    }]";
    var myConverter=新的myConverter();
    var models=JsonConvert.DeserializeObject(json,myConverter);
    
    使用HTML5文件API(选项1)。