Thriftでバイナリデータをやりとりする方法。
以前、FlexでXML-RPCを利用していた時は、確かbase64にエンコードして返していたと思うので、
Thriftでも同様にバイナリデータはbase64にエンコードして返すようにします。
Thriftのソースを漁っていると TBase64Utils とかいうのを見つけたのですが、
どうせboost必須なフレームワークなのでboostを使ってエンコードしてみます。
インタフェースとして、
・サービス名を Test
・プロシージャ名を returnImage
・引数は画像ファイル名、戻り値はbase64エンコード文字列
を定義します。
#!/usr/bin/thrift service Test { string returnImage(1: string name) }
画像ファイルを読み込んで、base64にエンコードするだけの処理です。
boostでbase64にエンコードする方法は以下のサイトを参考にさせていただきました。
B Lifeで行こう: boostでbase64のエンコード
ここではハンドラの部分のみ、自動生成部分は省略します。
[csharp]
class TestHandler : virtual public TestIf {
public:
TestHandler() {
}
void returnImage(std::string& _return, const std::string& name) {
std::ifstream ifs;
std::ostringstream oss;
std::string str;
ifs.open(name.c_str(), std::ios::in | std::ios::binary);
if(!ifs.is_open()) {
_return = “”;
}else {
oss<
// エンコードしたデータを格納
std::stringstream ost_base64;
// エンコード処理
std::copy(
base64_encoder(src_data.c_str()),
base64_encoder(src_data.c_str() + src_data.length()),
std::ostream_iterator
);
std::string base64 = ost_base64.str();
// 末尾の長さ調整
while(((base64.length() % (Base64_Column_Width + 1)) % 4) > 0) {
base64 += “=”;
}
return base64;
}
};
[/csharp]
次にクライアントを今回はPHPで書きます。
RPCで受け取ったbase64エンコード文字列をimgタグに埋め込んで画面に表示します。
[php]
open();
$img = $client->returnImage(“lenna.jpg”); /* $img に base64エンコード文字列が入る */
$transport->close();
}catch(Exception $e) {
echo $e->getMessage();
}
?>
Thrift::例外処理
Thriftインストール