Archive for the 'Restlet' Category

Restlet1.1.2でProxyを経由するのがめんどい

Restletをクライアントとして使う場合、Commons-HttpClientと組み合わせて使うんだけど、そんときにProxy通さなきゃいけない場合にめんどかったのでメモ。

まず、普通にhttp.proxyHostとhttp.proxyPortにProxyのホスト名とポート番号設定するだけじゃ動きません。
それってCommons-HttpClient使うときも同じで、HostConfigurationのsetProxyメソッドで設定してやる必要がある。
だけど、RestletをCommons-HttpClientと組み合わせる場合、Commons-HttpClientは完全に隠蔽されていて直接Commons-HttpClientのクラスにアクセスすることができません。

ってなわけで、なんかやり方ないかと思いググってみた。そしたら

Webサービス プログラミング総合スレッド

794 :デフォルトの名無しさん[]:2008/01/16(水) 21:18:52
restletクライアントのHTTPプロキシ設定でどうやるんですか?
ぐぐってもドキュメントみても何も出てこないです
795 :794[]:2008/01/17(木) 01:04:12
出来たけど難しかった。

うがー、なんか書いといてよー!
気を取り直して他の情報見ると、どうやらバグ報告があり、1.2で直る予定っぽい。
しょうがないので自分で改造するかってことで、RestletのClientクラスの代わりにMyClientクラスを作成することに。

ホントは、Clientクラスの中身コピってMyClientにしようと思ったんだけど、Clientクラス内で呼び出しているEngine#createHelperがどうしても引数にClientクラスのインスタンスを必要とするので、Clientクラスを継承してMyClientクラスを作ります。Engineクラスまで書き換えるのめんどいし。

Clientクラスのhandleメソッドは以下のようになっています。

    @Override
    public void handle(Request request, Response response) {
        super.handle(request, response);

        if (getHelper() != null) {
            getHelper().handle(request, response);
        }
    }

ここで、if文の中のgetHelper().handle(request, response)を実行すると、Proxyが超えられなくてエラーになります。
でも、super.handle(request, response)の呼び出しはやっとかないといけません。
そこで、handleメソッドを次のようにオーバーライドしました。

    @Override
    public void handle(Request request, Response response) {
        super.init(request, response);

        if (getHelper() != null) {
            HostConfiguration hostConfig = new HostConfiguration();
            hostConfig.setProxy(System.getProperty("http.proxyHost"), Integer
                    .parseInt(System.getProperty("http.proxyPort")));
            ((HttpClientHelper) helper).getHttpClient().setHostConfiguration(
                    hostConfig);
            getHelper().handle(request, response);
        }
    }

1行目がsuper.handle(request, response)じゃなくて、super.init(request, response)なのがミソ。
このinitメソッドはClientの親のConnectorの親のRestletクラスのメソッド。結局、Clientクラスのhandleメソッド内のsuper.handle(request, response)はこのinitメソッドを実行するだけなので、これで大丈夫。
このメソッドは、実はdeprecatedで次バージョンではなくなるよ!って書いてあるんだけど、次バージョンではこんな改造いらなくなるはずだからまあいいでしょう。

はてブやLDCのコメントにトラックバックを打てるサービスを公開しました。

ネット実名論争やらはてブのネガティブコメント論争やらが起こったり沈静化したりする今日この頃ですが皆さまいかがお過ごしでしょうか。

さて、めそらぼでは、表題の通り、はてブやlivedoor Clipのコメントにトラックバックを打てるサービス「ぶっこめ!」を公開しました。
これによって、反論を受けないところから安全に暴言を吐いてくるからソーシャルブックマークサービスなんて嫌いだ!という池田信夫先生のような方々も反論をすることができるようになります。精神衛生上よろしいのではないかと思いますので、是非使ってみてください。

例えば、拙作サービスのランチオフったーへのブックマークコメントのページは
http://server.mesolabs.com/bukkome/url/http://server.mesolabs.com/lunchofftter/
になります。
また、このエントリ自身が、執筆時点での最新コメントである
http://server.mesolabs.com/bukkome/url/http://server.mesolabs.com/lunchofftter/#1203802507000
へトラックバックを打っています。どのように表示されているかご確認いただけると思います。

なお、まだまだ全くブラシュアップ出来てない状態での公開ですので、不具合/バグ等は沢山あると思います。実装されてない機能等もございます。
どうか、生暖かく見守ってやってください。

さて、今回もJavaのみで作成しました。Web層のフレームワークはもちろんApache Wicketを使いました。
また、ソーシャルブックマークサービスとの連携のクライアントとして、またトラックバックを受け付ける処理の窓口としてRestletも使ってみました。
さらに、今回はデータベースとして、オブジェクトデータベースであるNeoDatis ODBを使ってみました。
その辺の技術的な話に関してはまた改めてエントリを書きたいと思います。

なお、このサービスによって生じたいかなる不具合や不利益に関して一切の責は負いかねます。自己責任でお使いください。
また、問答無用で予告なくサービスを終了させたり、データベースを初期化したりすることもございます。ご了承ください。
不具合や要望等ありましたら、このエントリへのコメントやTwitter@mesoへお願いします。

(追記:3/17 10:10 現在、上記ランチオフったーへのブックマークコメントのページはエラーが表示されています。原因究明中…)
(追記:3/17 10:50 とりあえずエラー原因のデータを削除して復活させました。)
(追記:3/17 11:20 トラックバックURLにブラウザでアクセスする(GETでアクセスする)と発生する不具合だと判明。修正しました。)

次のページ »