サーバーサイドとの連携
この「ポータル・スケジューラー」システムでは、サーバーサイドをPHPで実装しています。CurlからPHPに値を渡すときはPOSTで行い、PHPからの結果はXMLで受け取ります。CurlはSAX2パーサーをサポートしています。
{define-class public final MyHttp field private _box: VBox field private _frm: HttpForm {constructor public {default} set self._box = {VBox}, self._frm = {HttpForm {url ""}, method = HttpRequestMethod.post, default-character-encoding = {get-character-encoding-by-name "euc-jp"}, self._box } } {method public {execute p_url: Url, ...}: (bool, String) let v_sts?: bool = true, v_value: StringBuf = {StringBuf} {self.createform-proc p_url, ...} set self._frm.encoding = HttpFormData.urlencoded-mime-type {try {with-open-streams in: HttpTextInputStream = {self._frm.submit-open} do let v_flg?: bool = false {while not in.end-of-stream? do {if v_flg? then {v_value.concat "\n"} } {v_value.concat {{in.read-line}.to-String} } set v_flg? = true } } catch e: Exception do set v_sts? = false } {return v_sts?, {v_value.to-String} } } ||HttpFormにサーバー側に渡すためのTextFieldを作成して渡したい値をセット {method private {createform-proc p_url: Url, ...}: void let v_cnt: int = 0, v_name: String = "", v_value: String = "" {self._frm.reset} {self._box.clear} set self._frm.form-action = p_url {for value in ... do {if v_cnt rem 2 == 0 then set v_name = value else set v_value = value {self._box.add {TextField name = v_name, value = v_value } } } {inc v_cnt} } } }
ローカルにあるファイルの内容もサーバに送ることができます。PHP側は、HTMLの<input>タグで送信されたファイルを受け取るときと同じ要領で、ファイルの内容を受け取っています。
{define-class public final MyHttp field private _box: VBox field private _frm: HttpForm {constructor public {default} set self._box = {VBox}, self._frm = {HttpForm {url ""}, method = HttpRequestMethod.post, default-character-encoding = {get-character-encoding-by-name "euc-jp"}, self._box } } {method public {execute-with-file p_url: Url, p_files: #UrlArray, ...}: (bool, String) let v_sts?: bool = true, v_value: StringBuf = {StringBuf}, v_fileno: int = 0 {self.createform-proc p_url, ...} set self._frm.encoding = HttpFormData.multipart-mime-type {if-non-null p_files then {for value: Url in p_files do {self._frm.add-file {String v_fileno}, value} {inc v_fileno} } } {try {with-open-streams in: HttpTextInputStream = {self._frm.submit-open} do let v_flg?: bool = false {while not in.end-of-stream? do {if v_flg? then {v_value.concat "\n"} } {v_value.concat {{in.read-line}.to-String} } set v_flg? = true } } catch e: Exception do set v_sts? = false } {return v_sts?, {v_value.to-String} } } ||HttpFormにサーバー側に渡すためのTextFieldを作成して渡したい値をセット {method private {createform-proc p_url: Url, ...}: void let v_cnt: int = 0, v_name: String = "", v_value: String = "" {self._frm.reset} {self._box.clear} set self._frm.form-action = p_url {for value in ... do {if v_cnt rem 2 == 0 then set v_name = value else set v_value = value {self._box.add {TextField name = v_name, value = v_value } } } {inc v_cnt} } } }
まとめ
Curlは、Java、C++の良いところを組み合わせた言語といわれるだけあって、とてもよくできた言語だと思います。簡単に標準のコントロールを拡張することができ、自由度も非常に高いです。
ヘルプも充実しており、実際にコードを入力してその場で実行結果をみることができる点も魅力的です。もし興味があれば、一度、Curlを触ってみてはいかがでしょうか。