2012-04-11 110 views
4

我是PHP新手,并试图在PHP中为我的移动应用程序构建RestFull服务。我google搜索,发现Create a REST API with PHP文章最好根据建议由很多人在Stackoverflow和其他地方。PHP:在哪里把Restful服务代码放在正确的位置?

但是在读这篇文章,我安排这个代码像下面,无法找出给定的最后两个函数,在什么地方呢?

PHP对我来说是新的语言..所以请帮助我。

class RestUtils 
{ 
    public static function processRequest() 
    { 
     // get our verb 
     $request_method = strtolower($_SERVER['REQUEST_METHOD']); 
     $return_obj  = new RestRequest(); 
     // we'll store our data here 
     $data   = array(); 

     switch ($request_method) 
     { 
      // gets are easy... 
      case 'get': 
       $data = $_GET; 
       break; 
      // so are posts 
      case 'post': 
       $data = $_POST; 
       break; 
      // here's the tricky bit... 
      case 'put': 
       // basically, we read a string from PHP's special input location, 
       // and then parse it out into an array via parse_str... per the PHP docs: 
       // Parses str as if it were the query string passed via a URL and sets 
       // variables in the current scope. 
       parse_str(file_get_contents('php://input'), $put_vars); 
       $data = $put_vars; 
       break; 
     } 

     // store the method 
     $return_obj->setMethod($request_method); 

     // set the raw data, so we can access it if needed (there may be 
     // other pieces to your requests) 
     $return_obj->setRequestVars($data); 

     if(isset($data['data'])) 
     { 
      // translate the JSON to an Object for use however you want 
      $return_obj->setData(json_decode($data['data'])); 
     } 
     return $return_obj; 
    } 


    public static function sendResponse($status = 200, $body = '', $content_type = 'text/html') 
    { 
     $status_header = 'HTTP/1.1 ' . $status . ' ' . RestUtils::getStatusCodeMessage($status); 
     // set the status 
     header($status_header); 
     // set the content type 
     header('Content-type: ' . $content_type); 

     // pages with body are easy 
     if($body != '') 
     { 
      // send the body 
      echo $body; 
      exit; 
     } 
     // we need to create the body if none is passed 
     else 
     { 
      // create some body messages 
      $message = ''; 

      // this is purely optional, but makes the pages a little nicer to read 
      // for your users. Since you won't likely send a lot of different status codes, 
      // this also shouldn't be too ponderous to maintain 
      switch($status) 
      { 
       case 401: 
        $message = 'You must be authorized to view this page.'; 
        break; 
       case 404: 
        $message = 'The requested URL ' . $_SERVER['REQUEST_URI'] . ' was not found.'; 
        break; 
       case 500: 
        $message = 'The server encountered an error processing your request.'; 
        break; 
       case 501: 
        $message = 'The requested method is not implemented.'; 
        break; 
      } 

      // servers don't always have a signature turned on (this is an apache directive "ServerSignature On") 
      $signature = ($_SERVER['SERVER_SIGNATURE'] == '') ? $_SERVER['SERVER_SOFTWARE'] . ' Server at ' . $_SERVER['SERVER_NAME'] . ' Port ' . $_SERVER['SERVER_PORT'] : $_SERVER['SERVER_SIGNATURE']; 

      // this should be templatized in a real-world solution 
      $body = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 
         <html> 
          <head> 
           <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> 
           <title>' . $status . ' ' . RestUtils::getStatusCodeMessage($status) . '</title> 
          </head> 
          <body> 
           <h1>' . RestUtils::getStatusCodeMessage($status) . '</h1> 
           <p>' . $message . '</p> 
           <hr /> 
           <address>' . $signature . '</address> 
          </body> 
         </html>'; 

      echo $body; 
      exit; 
     } 
    } 


    public static function getStatusCodeMessage($status) 
    { 
     // these could be stored in a .ini file and loaded 
     // via parse_ini_file()... however, this will suffice 
     // for an example 
     $codes = Array(
      100 => 'Continue', 
      101 => 'Switching Protocols', 
      200 => 'OK', 
      201 => 'Created', 
      202 => 'Accepted', 
      203 => 'Non-Authoritative Information', 
      204 => 'No Content', 
      205 => 'Reset Content', 
      206 => 'Partial Content', 
      300 => 'Multiple Choices', 
      301 => 'Moved Permanently', 
      302 => 'Found', 
      303 => 'See Other', 
      304 => 'Not Modified', 
      305 => 'Use Proxy', 
      306 => '(Unused)', 
      307 => 'Temporary Redirect', 
      400 => 'Bad Request', 
      401 => 'Unauthorized', 
      402 => 'Payment Required', 
      403 => 'Forbidden', 
      404 => 'Not Found', 
      405 => 'Method Not Allowed', 
      406 => 'Not Acceptable', 
      407 => 'Proxy Authentication Required', 
      408 => 'Request Timeout', 
      409 => 'Conflict', 
      410 => 'Gone', 
      411 => 'Length Required', 
      412 => 'Precondition Failed', 
      413 => 'Request Entity Too Large', 
      414 => 'Request-URI Too Long', 
      415 => 'Unsupported Media Type', 
      416 => 'Requested Range Not Satisfiable', 
      417 => 'Expectation Failed', 
      500 => 'Internal Server Error', 
      501 => 'Not Implemented', 
      502 => 'Bad Gateway', 
      503 => 'Service Unavailable', 
      504 => 'Gateway Timeout', 
      505 => 'HTTP Version Not Supported' 
     ); 

     return (isset($codes[$status])) ? $codes[$status] : ''; 
    } 
} 

class RestRequest 
{ 
    private $request_vars; 
    private $data; 
    private $http_accept; 
    private $method; 

    public function __construct() 
    { 
     $this->request_vars  = array(); 
     $this->data    = ''; 
     $this->http_accept  = (strpos($_SERVER['HTTP_ACCEPT'], 'json')) ? 'json' : 'xml'; 
     $this->method   = 'get'; 
    } 

    public function setData($data) 
    { 
     $this->data = $data; 
    } 

    public function setMethod($method) 
    { 
     $this->method = $method; 
    } 

    public function setRequestVars($request_vars) 
    { 
     $this->request_vars = $request_vars; 
    } 

    public function getData() 
    { 
     return $this->data; 
    } 

    public function getMethod() 
    { 
     return $this->method; 
    } 

    public function getHttpAccept() 
    { 
     return $this->http_accept; 
    } 

    public function getRequestVars() 
    { 
     return $this->request_vars; 
    } 
} 

///// 代码srgments对此我无法把在正确的位置 ///////////////////////

//////////////////////////////////////////////// ////////////////////////////////////////////////// //////

$data = RestUtils::processRequest(); 

    switch($data->getMethod) 
    { 
     case 'get': 
      // retrieve a list of users 
      break; 
     case 'post': 
      $user = new User(); 
      $user->setFirstName($data->getData()->first_name); // just for example, this should be done cleaner 
      // and so on... 
      $user->save(); 
      break; 
     // etc, etc, etc... 
    } 
    ///////////////////////////////// 
    switch($data->getMethod) 
    { 
     // this is a request for all users, not one in particular 
     case 'get': 
      $user_list = getUserList(); // assume this returns an array 

      if($data->getHttpAccept == 'json') 
      { 
       RestUtils::sendResponse(200, json_encode($user_list), 'application/json'); 
      } 
      else if ($data->getHttpAccept == 'xml') 
      { 
       // using the XML_SERIALIZER Pear Package 
       $options = array 
       (
        'indent' => '  ', 
        'addDecl' => false, 
        'rootName' => $fc->getAction(), 
        XML_SERIALIZER_OPTION_RETURN_RESULT => true 
       ); 
       $serializer = new XML_Serializer($options); 

       RestUtils::sendResponse(200, $serializer->serialize($user_list), 'application/xml'); 
      } 

      break; 
     // new user create 
     case 'post': 
      $user = new User(); 
      $user->setFirstName($data->getData()->first_name); // just for example, this should be done cleaner 
      // and so on... 
      $user->save(); 

      // just send the new ID as the body 
      RestUtils::sendResponse(201, $user->getId()); 
      break; 
    } 
    ///////////////////////////////////////////////////////////////////////////////////// 

回答

1

看看这个链接,

我们可以用笨创建一个RESTful API为你存在并演示如何与您自己的API或其他RESTful Web服务(如Facebook和Twitter)进行交互。

Working with Restful Services in CodeIgniter

愿这有帮助你。

+1

我想你也应该提供直接链接之前提供一些总结。 :) – 2012-07-17 09:16:18