带有附件和常规字段的POST C#
我用的是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”:“
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)。