2017-01-23 13 views
0

私はC#を使用しています。 {{「ファイル名」::私は辞書を送信することができ添付ファイルと一般的なフィールドを持つPOST C#

添付ファイル付きのHTTPリクエストを行うために「最善」の方法であるかを知りたい

  1. は、私はいくつかの質問を持っています」 FileBase64Stream: "SOME BASE 64 STRING"}}

    添付ファイルを送信する別の方法がありますか?

    {{ "値": "1.2"、 "タイプ": "フロート"

  2. は、私は次の方法でそれをやった、JSONなどの一般的なオブジェクト(int型、文字列など)を送信したいです{"value": "type": "int"}、{"value": "Hello"、 "type": "string"}、{"value": "00011111010101" :「バイト」}}

しかし、この場合には、クライアントがタイプ応じた値を変換する必要があり、JSONとして「一般」のオブジェクトを送信すると、それを解析する別の方法はありますか? Base64エンコーディングが小さいペイロードの罰金可能性がありますが

Thakns

+0

使用HTML5ファイルAPI(オプション1)。 –

答えて

0

は、大きなファイルのために、それはあまりにも多くのオーバーヘッドを追加します。代わりにRFC 2388に定義されているようにmultipart/form-dataを使用することをお勧めします。ファイルをバイナリストリームとして直接送信できるからです。ほとんどのサーバー側のAPIフレームワークでは、multipart/form-dataエンコードされたリクエストのネイティブサポートがあります。ここでは例のペイロードがあります:

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-- 

汎用オブジェクトをデシリアライズについてのあなたの2番目の質問については、Json.NETパッケージには、このような状況に対処するためのカスタムJsonConverterを書き込むことができます。デシリアライズするとき今、すべての残っているこのコンバータを使用している

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

を::

public class MyModel 
{ 
    public object Value { get; set; } 

    public string Type { get; set; } 
} 

し、それを処理するためのコンバータを書く:あなたは、あなたのデータをモデル化することによって開始することができます

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); 
関連する問題