JSON / XMLを介して(レール)RESTfulエンドポイントにバイナリデータを送信しますか?
-
06-07-2019 - |
質問
現在、jsonとxmlを介してのみデータを送受信するRailsベースのWebアプリケーションを作成しています。ただし、一部の要件には、バイナリデータ(画像)をアップロードする機能が含まれています。
今、JSONは完全に理解しているわけではありませんが、アプリケーションへのこれら2つのエントリポイントでバイナリファイル/データを受信する問題にどのように対処しますか?
解決
base64などのバイナリデータをエンコードすることをお勧めします。これにより、XMLまたはJSON形式で安全に使用できます。
他のヒント
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灯台のサイトでバグを修正します。