私は、backbone.jsで構築された単一のWebページアプリから使用されるjson rest Webサービスを開発しています
このAPIにより、プロジェクトに関連するPDFレポートなど、一部のエンティティに関連するファイルをユーザーがアップロードできるようになります
ぐるぐる回ってスタックオーバーフローでいくつかの調査を行うと、次のようなアプローチが可能になりました。
最初のアプローチ:base64エンコードされたデータフィールド
POST: /api/projects/234/reports
{
author: 'xxxx',
abstract: 'xxxx',
filename: 'xxxx',
filesize: 222,
content: '<base64 encoded binary data>'
}
2番目のアプローチ:マルチパートフォームポスト:
POST: /api/projects/234/reports
{
author: 'xxxx',
abstract: 'xxxx',
}
応答として、レポートIDを取得します。これで、別の投稿を発行します
POST: /api/projects/234/reports/1/content
enctype=multipart/form-data
そして、バイナリデータを送信します
(これを見てください: https://stackoverflow.com/a/3938816/476 )
3番目のアプローチ:バイナリデータを別のリソースに投稿し、hrefを保存します
まず、クライアントでランダムキーを生成し、そこにバイナリコンテンツを投稿します
POST: /api/files/E4304205-29B7-48EE-A359-74250E19EFC4
enctype=multipart/form-data
その後
POST: /api/projects/234/reports
{
author: 'xxxx',
abstract: 'xxxx',
filename: 'xxxx',
filesize: 222,
href: '/api/files/E4304205-29B7-48EE-A359-74250E19EFC4'
}
(これを参照してください: https://stackoverflow.com/a/4032079/476 )
私が使用できるアプローチが他にあるかどうか、それぞれの長所/短所、およびこの種の要件に対処する確立された方法があるかどうかを知りたかっただけです
私が最初のアプローチで見る大きな欠点は、クライアントでファイルを完全にロードしてbase64エンコードする必要があることです
いくつかの有用なリソース:
私の研究結果:
単一リクエスト(データを含む)
リクエストにはメタデータが含まれています。データはメタデータのプロパティであり、エンコードされています(例:Base64)。
長所:
短所:
例:
単一リクエスト(マルチパート)
リクエストには、メタデータとデータを含む1つ以上の部分が含まれています。
コンテンツタイプ:
長所:
短所:
例:
単一のリクエスト(HTTPヘッダーとURLのメタデータ)
リクエストの本文にはデータとHTTPヘッダーが含まれ、URLにはメタデータが含まれます。
長所:
短所:
2つのリクエスト
メタデータの1つのリクエストとデータの1つ以上のリクエスト。
長所:
短所:
例:
私は頭の上から他のアプローチを考えることはできません。
あなたの3つのアプローチのうち、私は方法3を最もよく使用しました。私が目にする最大の違いは、最初の方法と他の方法2の違いです:メタデータとコンテンツを2つのリソースに分離する
最初の方法は、コーディングが最も簡単なようです。ただし、このサービスの使用頻度が低いことが予想され、ユーザーファイルのアップロードに適切な制限を設定できる場合にのみ、最初の方法を使用します。
究極の方法は、HTTP標準から取得した値を最大化できるという主な理由から3番目(個別のリソース)であると考えています。これは、REST APIの考え方に一致します。たとえば、十分に接地されたHTTPクライアントが使用されているとすると、次の利点があります。
image/jpeg
またはimage/png
。 HTTPヘッダーAcceptおよびContent-typeは、いくつかのエレガントなセマンティクスを提供しますスキーマやAPIの一部としてハードコードする必要なしに、クライアントとサーバー間でこれをネゴシエートします。一方、問題のバイナリデータがオプションでない場合、この方法が最も単純ではないと結論付けるのは公平だと私は思います。その場合、 Eric Huの答え にリストされている短所が出てきます。