404 motivation not found | t_ishidaのブログ

6月/08

6

PHPでRESTな感じのエンティティ実装方法の模索

能書き

僕以外の誰が読んでも面白くないし掲題の通り模索中だしソースだけだし。

多分、コンストラクタでサーバー変数とか受け取るようにする。

クラスとテスト

<?php
abstract class RESTResource{
protected $ContentType = 'text/xml';
protected $CharSet     = 'utf8';
protected $needAuth    = false;

public function doService(){
$r = $_SERVER['REQUEST_METHOD'];
if( $this->needAuth && !$_SERVER['PHP_AUTH_USER'] )  return $this->showError();
if( preg_match( '/get/i'   , $r ) ) return $this->get( $_GET );
if( preg_match( '/post/i'  , $r ) ) return $this->post( $this->parseParameters() );
if( preg_match( '/put/i'   , $r ) ) return $this->put( $this->parseParameters() );
if( preg_match( '/delete/i', $r ) ) return $this->delete( $this->parseParameters( ) );
}
private function parseParameters(){
$result = array();
foreach( split( '&', file_get_contents('php://input') ) as $pair ) {
list( $key, $value ) = split( '=', $pair );
$result[$key] = urldecode( $value );
}
return $result;
}
private function error(){ return '403じゃね?'; }
abstract function delete( $args );
abstract function put( $args );
abstract function post( $args );
abstract function get( $args );
}

class Test extends RESTResource{
public function delete( $args ){
print "<p>delete</p>";
print "<pre>"; var_dump( $args ); print "</pre>";
}
public function get( $args ){
print "<p>get</p>";
print "<pre>"; var_dump( $args ); print "</pre>";

}

public function post( $args ){
print "<p>post</p>";
print "<pre>"; var_dump( $args ); print "</pre>";
}

public function put( $args ){
print "<p>put</p>";
print "<pre>"; var_dump( $args ); print "<pre>";
}
}
$c = new Test;
$c->doService();

テストクライアント

<script type="text/javascript">
function $(id){ return document.getElementById( id );  }
function sendData(){
  var x = null;
  try      {  x = new XMLHttpRequest(); }
  catch(e) {
    try      { x = new ActiveXObject( "Msxml2.XMLHTTP" );    }
    catch(e) { x = new ActiveXObject( "Microsoft.XMLHTTP" ); }
  }
  x.onreadystatechange = function(){
    if( x.readyState != 4 ) return;
    $('result').innerHTML=  x.responseText.replace(/<\/pre>/mg ,'</pre>');
  }
  var params = [];
  for( var i = 1; i <= 3; i++ ) {
    params.push( 'p' + i + '=' + encodeURI( $( 'p' + i ).value ) );
  }
  var method =$('method').options[$('method').selectedIndex].value;
  if( method == 'get' ) x.open( method , './testx.php?' + params.join('&'), true);
  else                  x.open( method , './testx.php', true );
  x.send( params.join('&') );
}
</script>
<p>method :<select id="method">
<option value="get">get</option>
<option value="post">post</option>
<option value="put">put</option>
<option value="delete">delete</option>
</select></p>
<p>p1 : <input id="p1" type="text" >p2 : <input id="p2" type="text" >p3 : <input id="p3" type="text" ></p>
<p><input type="button" onclick="sendData();" value="xyzzy"></p>
<p>結果</p>
<div id="result" cols="100" rows="100">
</div>
Share and Enjoy:
  • Digg
  • del.icio.us
  • Google Bookmarks
  • Tumblr
  • email
  • Facebook
  • FriendFeed

RSS Feed

コメントはまだありません。

Leave a comment!

<< フレームワーク(笑)

テンプレートエンジンもどき >>

Find it!

Theme Design by devolux.org

Tag Cloud