SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Curlで構築する長崎電子県庁システム(ポータル・スケジューラー編)(AD)

Curlで構築する長崎県電子県庁システム(ポータル・スケジューラー)
部品の拡張とPHP連携

第1回

  • X ポスト
  • このエントリーをはてなブックマークに追加

サーバーサイドとの連携

 この「ポータル・スケジューラー」システムでは、サーバーサイドを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を触ってみてはいかがでしょうか。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Curlで構築する長崎電子県庁システム(ポータル・スケジューラー編)連載記事一覧

もっと読む

この記事の著者

株式会社ドゥアイネット 前田慎治(マエダシンジ)

株式会社ドゥアイネットに勤務するプログラマーです。制御系から事務系まで様々な開発を経験し、現在はCurlやOpenLaszloを使ってRIAの開発を担当しています。OpenLaszloで開発した「スマートスケジューラー」http://www.dinss.jp/

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/3274 2008/11/11 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング