JSON / XMLを介して(レール)RESTfulエンドポイントにバイナリデータを送信しますか?

StackOverflow https://stackoverflow.com/questions/426694

質問

現在、jsonとxmlを介してのみデータを送受信するRailsベースのWebアプリケーションを作成しています。ただし、一部の要件には、バイナリデータ(画像)をアップロードする機能が含まれています。

今、JSONは完全に理解しているわけではありませんが、アプリケーションへのこれら2つのエントリポイントでバイナリファイル/データを受信する問題にどのように対処しますか?

役に立ちましたか?

解決

base64などのバイナリデータをエンコードすることをお勧めします。これにより、XMLまたはJSON形式で安全に使用できます。

http://en.wikipedia.org/wiki/Base64

他のヒント

Base64 アルゴリズムをご覧ください。 これは、<!> quot; transform <!> quot;に使用されます。 ascii charへのすべて。 コーディングおよびデコードできます。 Webサービス、またはドットネットシリアル化でも使用されます。

これが少し役立つことを願っています。

編集:<!> quot; new post <!> quot;を見たが、投稿中に誰かが速くなった。 Rails base64

Railsとjsonおよびxmlを使用している場合は、HTTPを使用しています。 <!> quot; POST <!> quot; HTTPの一部であり、バイナリデータを変換する最良の方法です。 Base64はこれを行う非常に非効率的な方法です。

サーバーがデータを送信している場合、サーバー上のファイルへのパスをXMLまたはJSONで指定することをお勧めします。サーバーはデータをbase64でエンコードする必要がなく、すでにHTTP GETをサポートしているクライアントは、デコードせずにデータをプルダウンできます。 (GET / path / to / file)

ファイルを送信するには、サーバーやクライアントに一意のファイル名を生成させ、2段階のプロセスを使用させます。クライアントは、fileToBeUploadedでxmlまたはjsonメッセージを送信します。<!> quot; name of file.ext <!> quot;メッセージを送信した後、前述のファイル名でデータをPOSTします。繰り返しますが、クライアントとサーバーはデータをエンコードおよびデコードする必要はありません。これは、マルチパートリクエストを使用した1つのリクエストで実行できます。

Base64は簡単ですが、データのサイズとリクエストの頻度に応じて、CPUやメモリをすぐに消費します。サーバー側では、キャッシュされた操作ではありませんが、ディスクからファイルを読み取るWebサーバーの操作はキャッシュされます。

画像が大きすぎない場合、RoR:binaryタイプを使用してデータベースに配置することは非常に理にかなっています。データベースのレプリカがある場合、イメージは他のサイトに無料でコピーされ、孤立したイメージや未亡人のイメージの心配はなく、アトミックトランザクションの問題ははるかに簡単になります。

一方、Nessenceは、Base64が他のエンコードレイヤーと同様に、トランザクションにネットワーク、メモリ、およびCPUの負荷を追加するのは正しいことです。ネットワーク帯域幅が最大の問題である場合、Webサービスがdeflate / gzip圧縮接続を受け入れて提供することを確認してください。これにより、メモリとCPUの負荷がさらに 増加しますが、ネットワーク層のBase64データのコストが削減されます。

これらはアーキテクチャ上の問題であり、チームやクライアントと議論する必要があります。

最後に、RoRのXML RESTサポートについてお知らせします。デフォルトのscaffoldから次のようなコードを使用して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灯台のサイトでバグを修正します。

scroll top