↑これはアフィリエイトではなく私ができる環境問題への取り組みとして入れてみました↑ 
↑クリックで救える生命があるなら私は毎日クリックします。あなたもしてみませんか?↑
PHPの最近のブログ記事

2008年10月28日

各都道府県のコース一覧でAtomFeedを作ってみた。

自転車でヒルクライムしようぜ!で、各都道府県のコース一覧のページでAtomFeedを出力するようにしてみた。これはCakePHPを使っていますが、Zend_Feedを使ったAtomComponentを作ってやってます。といってもAtomの仕様とかにもあんまり詳しくないので、適当に、Zend Frameworkのドキュメントを読んで作りました。

こいつをThunderbirdなどで購読すると、自分のいる都道府県に新しいコースが登録されたら自動的に通知されるはず。まあ、需要はあるかどうかは謎ですがw、とりあえず、色々とやってみるという気持ちでいますのでやってみたという感じ。作業時間は、1.5時間程度だったでしょうか。

投稿者 パトラッシュ : 投稿時刻 : 01:34 個別ページ | コメント(0) | トラックバック(0)

2008年9月 6日

CakePHP: お問い合わせプラグインを作成

CakePHP1.1で、お問い合わせプラグインを作りました。

入力項目は、


  1. 名前

  2. メールアドレス

  3. カテゴリー(選択)

  4. 件名

  5. 本文


です。

私が使ってるPEAR::Mailを使ったMailComponentが必要なので、同梱しています。もし、MailComponentが既にある場合は、InquiryControllerの内容を書き換えるか、私が使ってるMailComponentを使ってください。

デモというか、ページの感じは、私のサイトで確認できます。(実際に動いてます)

http://hillclimb.319ring.net/inquiry/

以下のリンクからダウンロード可能です。使用される方はreadme.txtをよく読んでから使用してください。

cake_inquiry_plugin_ver_1.0.zip

投稿者 パトラッシュ : 投稿時刻 : 02:45 個別ページ | コメント(0) | トラックバック(0)

2008年8月27日

SOAP 結合テスト

php-soapを使った、SoapClientと、javaでのSoapServerでの結合テストが行われた。こちらは仕様書通りのSOAPメッセージを出しているから、バッチリだろう。そう思っていた。

すると、まずSOAPのバージョンから違った…。俺が実装してたのは、仕様書に載っていたSOAP1.2で、SoapServerが実装してたのはSOAP1.1だった。いきなり仕様書通りじゃないとは!

しかしこちらはクライアントなので、サーバに合わせなければならない。あれをこうして、それをああして、という話を聞いている間に、仕様書には書かれてないSOAPメッセージになった…。

とりあえず、修正したSOAPメッセージを使ったところ、通信できた。まあ一応よかった〜という話にはなったが、じゃああの仕様書は一体なんだったんだろう…。お客さんから届いた仕様書の通りに作ったのに、違いますって言われても…。違うのは仕様書ってことになるやん。その仕様書はお客さんからもらってるんだけど…。

まずは通信ができることを最優先するみたいだが、SOAP1.2を使う予定だったのに1.1で実装しているSoapServerが他のWebAPIで問題になるんじゃないかとヒヤヒヤしている。まあそれもテストをしていればわかることだが。

ちなみにスタブで使ってたphpのSoapServerでは、オプションでsoap_version => SOAP_1_1にして、クライアントはsoap_version => SOAP_1_2にしても、なぜか通信できてたみたい。柔軟に対応してくれるってことか?

投稿者 パトラッシュ : 投稿時刻 : 22:24 個別ページ | コメント(0) | トラックバック(0)

2008年8月26日

php-soapでわかったこと

色々とあって、php-soapやってますが、わかったことがあるので載せときます。
たしか、こんな感じにしたと思う。

◆SOAPメッセージの要素を入れ子にする方法(wsdlなし)


$options = array(
'soap_version' => SOAP_1_2,
'location' => 'http://example.net', // SoapServerのURL
'uri' => 'http://example.net/namespace/', // 名前空間のURL
'trace' => true, // トレースOKにするか否か
'exceptions' => false // SoapFault型の例外をスローするか否か
);
$obj_soap_client = new SoapClient(null, $options); // wsdlなし、オプションは各自適当にしてネ

$ar_children = array(
new SoapVar($obj_a, SOAP_ENC_OBJECT, null, null, 'child'),
new SoapVar($obj_b, SOAP_ENC_OBJECT, null, null, 'child'),
new SoapVar($obj_c, SOAP_ENC_OBJECT, null, null, 'child'),
);
$obj_parent = new SoapVar($ar_children, SOAP_ENC_OBJECT, null, null, 'parent');
$response = $obj_soap_client->something($obj_parent); // somethingメソッドはSoapServerで定義されてること

◆もっともっと、入れ子にする方法


$ar_children = array(
new SoapVar(3, XSD_INTEGER, null, null, 'number'),
new SoapVar(array(
new SoapVar(170, XSD_INTEGER, null, null, 'height'),
new SoapVar(65, XSD_INTEGER, null, null, 'weight'),
new SoapVar('Aさん', XSD_STRING, null, null, 'name'),
), SOAP_ENC_OBJECT, null, null, 'child'),
new SoapVar(array(
new SoapVar(190, XSD_INTEGER, null, null, 'height'),
new SoapVar(100, XSD_INTEGER, null, null, 'weight'),
new SoapVar('Bさん', XSD_STRING, null, null, 'name'),
), SOAP_ENC_OBJECT, null, null, 'child'),
new SoapVar(array(
new SoapVar(175, XSD_INTEGER, null, null, 'height'),
new SoapVar(80, XSD_INTEGER, null, null, 'weight'),
new SoapVar('Cさん', XSD_STRING, null, null, 'name'),
), SOAP_ENC_OBJECT, null, null, 'child'),
);
$obj_parent = new SoapVar($ar_children, SOAP_ENC_OBJECT, null, null, 'parent');
$response = $obj_soap_client->something($obj_parent); // somethingメソッドはSoapServerで定義されてること

◆SoapServerからの戻り値について
なんと、stdClassで戻ってきやがる!
こちらは完全に連想配列のつもりでいたんで(まあこれは俺の完全な思い込みからだけど)、俺が準備したスタブの値(連想配列)で動いていたほかの人のプログラムにもろに支障が出た。うーん、戻り値を配列にするフラグくらいあるだろうと思ってネットで検索したが、めぼしいものは見つからなかった。一応、SoapClientのコンストラクタのオプションで

$options = array(
'features' => SOAP_SINGLE_ELEMENT_ARRAYS
);
というのがあったが、これはどうやら戻り値が1つの場合でも配列っぽくするよという意味っぽい(あくまでstdClassのメンバ変数でだろうけど)。

仕方がないので、stdClassを配列にキャストした。
その際、戻り値のみを


$response = (array)$response; // stdClassオブジェクトを配列にキャスト
とした場合、1次元しか配列にキャストされないので、戻り値が多次元の場合、再帰で処理しないといけないことに注意!(再帰のプログラムは先輩が作ってくださった。ありがとうございます!)

php-soapの情報はあんまりなかったので(見つけられなかったので?)、こういうメモが多くの人の役に立つことを祈ります。

投稿者 パトラッシュ : 投稿時刻 : 22:48 個別ページ | コメント(0) | トラックバック(0)

2008年8月19日

SOAPについて調べたことなどを書く

現在の案件でPHPでSOAPを使うことになったので、それについてちょっとメモ書きをしときます。
今回はPHP5なので、php-soapを使うこととした。

今回の問題点は、SOAPサーバがないのにSOAPクライアント作れって言われてるところ。
SOAPクライアントの動作を試すために、ダミーのSOAPサーバも作らなくてはならない。
まあ問題は他にもたくさんあるけれど、守秘義務ってことで!!

◆SoapClientについて
・インスタンス生成時のオプションについて
style・・・SOAP_RPC,SOAP_DOCUMENTの2種類がある。SOAP_DOCUMENTにしたら、SOAPの文字列になるだけっぽい。SOAP_RPCの場合(基本的にこっちが主流?)、サーバ側に準備されているメソッドをコールするのだが、自動的にenv:Bodyの第一要素名がコールされるメソッド名になる。

・名前空間の定義について(WSDLなしで)
なんか、自動的にns1とかns2とか振られる。こっちで制御できんのか?
SoapClientだと仕様書通りのXMLが生成できなかったので、domDocumentオブジェクトを使ってXMLを作った。

◆SoapServerについて
SoapServerは、SOAP_RPCでくるのを前提として待ち構えてる?
仕様書通りのSOAPドキュメントを作成して送信したら、第一要素名のメソッドが定義されてないって怒られた。SoapClient側で__doRequestメソッドを使ってSOAPアクションを指定しても、同様。

SOAPは初めてだけど、奥が深そうです。
しかし、開発の順序として、SOAPサーバがあってからだろ!と突っ込まざるを得ない。

投稿者 パトラッシュ : 投稿時刻 : 23:24 個別ページ | コメント(0) | トラックバック(0)

ロード近影
Powered by
Movable Type 4.01
blogoole pingサーバ
トップページに戻るページトップへ移動
(C) Copyright 2004 - 2008 patorash All Right Reserved