2016-05-24 10 views
2

私は、例えば電子ブックのリストを返すREST APIに取り組んでいます。各電子ブックには多数の写真と1つのPDFがあります。私は各画像ファイルとpdfファイルの名前とURLを持っています。API JSON結果でファイルを返す方法は?

この情報をREST APIレスポンスにどのように含める必要がありますか?
1.写真と別のドキュメントを所有していますか?
2.ファイルを指定してファイルの種類を指定するだけですか?
3.それ以外の方法ですか?私は、次のJSONを持っている瞬間

{ 
    "ebooks": [ 
    { 
     "title": "ebook 1" 
    }, 
    { 
     "title": "ebook 2" 
    } 
    ] 
} 

私はそれが私のAPIエンドポイント間で一貫性であるので、これを行うための標準的な方法を持ってしようとしています。

答えて

2

をバイト配列に戻って変更して、ファイルを書き込むことができ、クライアントに続いてアクション

public IHttpActionResult GetEbooks() 
    { 
     var filePath = "{some file path}"; 
     var fileName = System.IO.Path.GetFileName(filePath); 
     var fileBytes = System.IO.File.ReadAllBytes(filePath); 
     var fileString = Convert.ToBase64String(fileBytes); 

     var returnData = new EbookCollection(); 
     returnData.Ebooks.Add(new Ebook() 
     { 
      Title = "ebook1", 
      FileName = fileName, 
      Content = fileString 
     }); 

     return Ok(JsonConvert.SerializeObject(returnData)); 
    } 

public class EbookCollection 
    { 
     public List<Ebook> Ebooks { get; set; } 

     public EbookCollection() 
     { 
      this.Ebooks = new List<Ebook>(); 
     } 
    } 

    public class Ebook 
    { 
     public string Title { get; set; } 
     public string Content { get; set; } 
     public string FileName { get; set; } 
    } 

の簡単な例であるあなたは本当にのようなAPIにちょうどメタデータを返す必要がありますあなたが記述したものと、内部にはebookレコードが挿入されています。

あなたのAPIからの応答は以下のJSONのようになります。

{ 
    "ebooks": [ 
    { 
     "title": "ebook 1", 
     "pictures:" [ 
      "http://myhost/pictures/picture1.jpg", 
      "http://myhost/pictures/picture2.jpg",   
      ], 
     "document": "http://myhost/ebooks/ebook1.pdf" 
    }, 
    { 
     "title": "ebook 2", 
     "pictures:" [ 
      "http://myhost/pictures/picture3.jpg", 
      "http://myhost/pictures/picture4.jpg",   
      ], 
     "document": "http://myhost/ebooks/ebook2.pdf" 
    } 
    ] 
} 

このアプローチは完全にRESTfulであるとHATEOAS制約はあなたが行うことをお勧めまさにです:あなたのリソースは、アドレス指定可能とします。

あなたはJSONと同じ応答を使用して生のバイナリコンテンツの両方を返すことができない、と私は強くあなたが2つの主な理由のためのJSONレスポンスにそれらをBase64で文字列にあなたのファイルを変換して返す避けることをお勧め

  1. Base64エンコーディングincreases up to the 33% percentファイルのサイズ
  2. あなたのAPIの応答は巨大になります。 10個の電子ブックレコード(わずかなamout)だけを返さなければならないと想像してください。これは、大量のデータ(pdf、画像など)をBase64にエンコードする必要があることを意味します。 APIからの簡単な応答により、ブラウザは数百MBのデータをダウンロードする可能性があります。
-1

過去のiveでは、元の64文字列として返されたファイルがクライアントで再アセンブリされました。ここでは、

0

これまで見てきたように、解決策1と2の両方が受け入れられます。

JSONは定義上拡張可能です。新しいタイプのリソースを追加する日には、JSONは問題にはなりません。新しいものをレスポンスに追加するだけで、クライアントによって無視されます(シリアライゼーションは新しいプロパティを無視する必要があります)。また、Javascriptのように使用されることもありません。プロパティはそこにありますが、クライアントコードはそれを使用すると、それだけで残す)。それ以外の場合は、クライアントに問題はありますが、APIはありません。

私が解決策1で見ることができる唯一の問題は、C#レベルでは、Open-Closedの原理で少しぶつかります。リソースのコレクションがあり、URLにアクセスするためにURLと共にタイプを指定すると、コードをResponseクラスに変更することなく、新しいタイプのリソースを作成することができます。これが解決策2が私の選択である理由です。

私が言ったように、両方の解決法が機能し、受け入れられます。

関連する問題