忍者ブログ
全くIT系ではない製造業の社員がイントラ上でColdFusionと格闘。システム構築を外部委託するとき「できればColdFusionでお願いします」と頼むのだが・・・・
[46] [45] [44] [43] [42] [41] [40] [39] [38] [37] [36]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

先日ギックリ腰になった上司はやはり翌日お休みでした。

さて、

MovabeType用のpingサーバーの作り方、その4です。
[その1] [その2] [その3]

1)pingが来たら、
2)postされたcontentの内容を読んで
3)XMLとして取り込み
4)URLを取り出したら
5)RSSを読みに行って
6)新着記事を入手し
7)データーベースに書く

の5) 6)について。

pingを送ってきたブログのURL(RSS)を既に入手しています。 #blogurl# という変数に入ってます。

5)
<cfhttp url="#blogurl#" method="GET" resolveurl="Yes" />  

6)
<cfset xmlDoc = XmlParse(CFHTTP.FileContent)>

この2行でOK・・・・? だからColdFusionって好き。
解説します。

5)RSSを読みに行く
<cfhttp url="#blogurl#" method="GET" resolveurl="Yes"  />
#blogurl#には、"http://kenw05/blog/yasmemo/index.rdf" という文字列が入っています。
MovableTypeが自動生成するRSSのアドレスです。
ちなみにこのブログの場合こんな感じ。(MovableTypeじゃないけどRSS1.0だからフォーマットは一緒)

CFHTTP(→LiveDocs) を使うと、ColdFusionでhttpのリクエストを発行し、結果を受け取ることが出来ます。
RSSが流行る前は、お気に入りのページをColdFusionに巡回させて、htmlファイルから新着情報を抜き出して表示させたりしていましたね。(カナリメンドクサ)

いろいろ奥が深いタグですが、method="GET"の場合CFHTTPの結果は、cfhttp. という接頭詞の変数で返ってきます。この中の、cfhttp.fileContent が入手したhtmlです(今回はindex.rdf)

名前

説明

cfhttp.charSet

レスポンスの Content-Type ヘッダで指定されたレスポンス文字セット (文字エンコード) です。

cfhttp.errorDetail

HTTP サーバーへの接続が失敗した場合に、失敗の詳細を記録します (例 : "Unknown host: my.co.com")。それ以外の場合は、空の文字列になります。エラー状態について、他の変数を確認する前にこの変数を確認することをお勧めします。

cfhttp.fileContent

レスポンス本文です。たとえば、GET オペレーションによって取得された HTML ページのコンテンツなどです。レスポンスをファイルに保管した場合は空になります。

cfhttp.header

すべてのヘッダ情報を 1 つの文字列に格納した生のレスポンスヘッダです。cfhttp.responseHeader 変数と同じ情報を含みます。

cfhttp.mimeType

レスポンスの Content-Type ヘッダで指定されている MIME タイプです (例 : text/html)。

cfhttp.responseHeader

構造体の形式にされたレスポンスヘッダです。要素キーは、Content-Type や Status_Code などのヘッダ名です。あるヘッダタイプのインスタンスが複数ある場合は、そのタイプの値が配列に格納されます。

よく使用されるテクニックは、#cfhttp.resonseHeader[fieldVariable]# のように、cfhttp.responseHeader 構造体をダイナミック配列としてダイナミックにアクセスすることです。

cfhttp.statusCode

HTTP Explanation ヘッダ値の後に続く HTTP status_code ヘッダ値です (例 : "200 OK")。

cfhttp.text

ブール値。レスポンス本文のコンテンツタイプがテキストである場合は true になります。ColdFusion は、次の場合にレスポンス本文をテキストとして認識します。

  • ヘッダにコンテンツタイプが指定されていない場合
  • コンテンツタイプが "text" で始まっている場合
  • コンテンツタイプが "message" で始まっている場合
  • コンテンツタイプが "application/octet-stream" である場合

cfhttp.fileContent は、ただの文字列です。
<cfdump ver="#CFHTTP.FileContent#">すると、こんな感じ。
テキストファイル
もしこのページが普通のhtmlだとしたら、その中から必要な情報を探すには骨が折れます。文字列の中からパターンを見つけて正規表現で抽出・・・・という手順が必要になります。
RSSはXMLなので、その辺がとても扱いやすいわけです。

で、6)<cfset xmlDoc = XmlParse(CFHTTP.FileContent)>

とすると、Xmlを解析してとても扱いやすく変換してくれます。
<cfdump var="#xmlDoc#">すると
xmlDocの内容
こんな感じ。ColdFuionの構造体変数に変換され、階層が整理されて表示されます。

最新記事のタイトルは、
#xmlDoc["rdf:RDF"].item[1].title.XmlText#
更新日時は
#xmlDoc["rdf:RDF"].item[1]["dc:date"].XmlText#
という感じで参照できます。

構造体のキー名に”:”コロンが入っていると、そのままドットシンタックスで繋げないので注意が必要です。

あとはこれをDBにinsertするわけです。


PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
ブログ内検索
プロフィール
HN:
CFIF
性別:
男性
自己紹介:
もっと日本でもColdFusionが広まって欲しいです。

情報通信を生業としない企業の、システム系でもない普通の社員なので、 ColdFusionは独学。参考書が少ないのがツライです・・・・なんだかんだ、ColdFusion4.xのシリウス時代から7年くらいのおつきあい?リンコムNextのソースが教科書かも。

外注するときはよく「できればColdFusionで・・・・」とお願いするのですが、ほとんどの場合「えっ!?」と驚かれてしまい、「SEのアサインが・・・」などと営業さんが困ってしまうことが多くて悲しいです。
ちょっとしたものなら自分でシステム構築しちゃいますが、一人でやるには時間が足りませんね・・・

FlashRemotingとかもやりますが、Flexには手を出してません。
と、最初の頃書きましたが、ついにFlexに手を出しました。Flex1.5はイマイチわかりませんでしたが、Flex2は別物ですね。これで6万円でイインデスカ?
そしてFlex2とColdFusionの組み合わせなら無敵な気がしますよ。ほんとに。
最新トラックバック
カレンダー
04 2024/05 06
S M T W T F S
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
なかのひと
忍者ブログ [PR]