PHP:将Restful服务代码放在正确位置的位置?
发布时间:2020-12-13 22:34:28 所属栏目:PHP教程 来源:网络整理
导读:我是 PHP的新手,并且正在尝试使用 PHP为我的移动应用程序构建RestFull服务.根据Stackoverflow和其他地方的许多人的推荐,我用Google搜索并发现了 Create a REST API with PHP条最佳文章. 但在阅读本文时,我安排了下面的代码,并且无法弄清楚给定的最后两个函数
我是
PHP的新手,并且正在尝试使用
PHP为我的移动应用程序构建RestFull服务.根据Stackoverflow和其他地方的许多人的推荐,我用Google搜索并发现了
Create a REST API with PHP条最佳文章.
但在阅读本文时,我安排了下面的代码,并且无法弄清楚给定的最后两个函数,在哪里放置它们? 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; } } ///// Code 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; } ///////////////////////////////////////////////////////////////////////////////////// 解决方法
看看这个链接,
我们可以使用CodeIgniter为您现有的Web应用程序创建RESTful API,并演示如何与您自己的API或其他RESTful Web服务(如Facebook和Twitter)进行交互. Working with Restful Services in CodeIgniter 愿这对你有所帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |