私は現在、jsonとxmlを介してのみデータを提供および受信するRailsベースのWebアプリケーションをまとめています。ただし、一部の要件には、バイナリデータ(画像)をアップロードする機能が含まれています。
私の理解では、JSONは完全にそのためのものではありません...しかし、アプリケーションへのこれら2つのエントリポイントを介してバイナリファイル/データを受信する問題に一般的にどのように対処しますか?
私は現在、jsonとxmlを介してのみデータを提供および受信するRailsベースのWebアプリケーションをまとめています。ただし、一部の要件には、バイナリデータ(画像)をアップロードする機能が含まれています。
私の理解では、JSONは完全にそのためのものではありません...しかし、アプリケーションへのこれら2つのエントリポイントを介してバイナリファイル/データを受信する問題に一般的にどのように対処しますか?
バイナリデータをbase64のようなものでエンコードすることをお勧めします。これにより、XMLまたはJSON形式で安全に使用できるようになります。
たぶん、 Base64アルゴリズムを見ることができます。これは、すべてをASCII文字に「変換」するために使用されます。あなたはそれをコーディングしてデコードすることができます。これは、Webサービス、またはdotnetシリアル化にも使用されます。
これが少し役立つことを願っています。
編集:私は「新しい投稿」を見ました、投稿している間、誰かがより速かったです。Rails base64
Rails と json と xml を使用している場合は、HTTP を使用しています。「POST」は HTTP の一部であり、バイナリ データを変換する最良の方法です。Base64 は、これを行うには非常に非効率的な方法です。
サーバーがデータを送信している場合は、サーバー上のファイルへのパスを XML または JSON で指定することをお勧めします。そうすれば、サーバーはデータを base64 でエンコードする必要がなく、HTTP GET を既にサポートしているクライアントは、データをデコードせずにプルダウンできます。(GET /path/to/file)
ファイルを送信するには、サーバーやクライアントに一意のファイル名を生成させ、2 段階のプロセスを使用します。クライアントは、fileToBeUploaded: "name of file.ext" を含む xml または json メッセージを送信し、メッセージの送信後、前述のファイル名でデータを POST します。繰り返しますが、クライアントとサーバーはデータをエンコードおよびデコードする必要はありません。これは、マルチパート リクエストを使用して 1 つのリクエストで実行できます。
Base64 は簡単ですが、データのサイズやリクエストの頻度によっては、CPU やメモリをすぐに消費してしまいます。サーバー側では、キャッシュされる操作ではありませんが、ディスクからファイルを読み取る Web サーバーの操作はキャッシュされます。
画像が大きすぎない場合は、RoR :binary 型でデータベースに配置することは非常に理にかなっています。データベースのレプリカがある場合、イメージは他のサイトに無料でコピーされ、孤立したイメージや未亡人のイメージについて心配する必要はなく、アトミック トランザクションの問題ははるかに単純になります。
一方、Nessence は、Base64 が他のエンコーディング レイヤーと同様に、ネットワーク、メモリ、および CPU の負荷をトランザクションに追加するという点で正しいです。ネットワーク帯域幅が最大の問題である場合は、Web サービスが deflate/gzip 圧縮接続を受け入れて提供していることを確認してください。これにより、ネットワーク層での Base64 データのコストが削減されますが、メモリと CPU の負荷がさらに増加します。
これらは、チームやクライアントと話し合う必要があるアーキテクチャの問題です。
最後に、RoR の XML REST サポートについてお知らせします。デフォルトのスキャフォールディングから次のようなコードを使用して XML にレンダリングすると、Rails:binary
データベース タイプは<object type="binary" encoding="base64">...</object>
XML オブジェクトになります。
def show
@myobject = MyObject.find(:id)
respond_to do |format|
format.xml { render => @myobject }
end
end
これは GET 操作に最適で、PUT 操作と POST 操作は簡単に記述できます。問題は、Rails の PUT 操作と POST 操作が同じタグを受け入れないことです。これは、from_xml
コードがタグを解釈せずtype="binary"
、代わりに を探すためtype="binaryBase64"
です。Rails lighthouse サイトには、これを修正するためのパッチを含むバグがあります。