zoukankan      html  css  js  c++  java
  • 使用TP5创建一个REST API

    原文在这里 : http://hmw.iteye.com/blog/1190827

    tp自带的api,get请求接口

    /**
         * 显示资源列表
         *
         * @return 	hinkResponse
         */
        public function index(Request $request)
        {
    //        $request_method = strtolower($_SERVER['REQUEST_METHOD']);
    //        $return_onj = new RestRequest();
    //        $data = db('ShopGoods')->select();
    
            $data = RestUtils::processRequest();
            $method = $data->getMethod();
    //        print_r($method);
    
            switch($method){
                case 'get':
                    $user_list = db('ShopGoods')->limit(2)->select();
    //                print_r($user_list);
                    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;
                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...
            }
    
    
    
        }
    

    2、  实现接口请求处理和请求处理的方法‘’

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2017/6/26
     * Time: 10:18
     */
    namespace appapicontroller;
    use appapicontrollerRestRequest;
    
    //简单的class来存储request的一些信息(RestRequest),和一个提供几个静态方法的class来处理请求和响应
    class RestUtils
    {
        //根据请求的内容类型来处理JSON或者XML,但是让我们现在简单一点。那么,我们处理请求的方法将会类似于这样
        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;
                case 'delete':
    
                    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 200:
                        $message = 'You must be authorized to view this page. 200';
                        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>  
                                ' . $message . '  
      
                                <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
            // 这些应该被存储在一个.ini的文件中,然后通过parse_ini_file()函数来解析出来,然而这样也足够了,比如:
            $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] : '';
        }
    }
    

      

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2017/6/26
     * Time: 10:18
     */
    namespace appapicontroller;
    use appapicontrollerRestUtils;
    
    //简单的class来存储request的一些信息(RestRequest),和一个提供几个静态方法的class来处理请求和响应
    
    class RestRequest
    {
        private $request_vars;
        private $data;
        private $http_accept;
        private $method;
    
        public function __construct()
        {
            $this->request_vars = array();
            $this->data = '';
            $this->http_accept = 'json';//(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;
        }
    }
    

      

  • 相关阅读:
    第六周学习心得
    syncnavigator关于win10、win8系统无法注册机进行激活的问题
    使用SyncNavigator轻松实现数据库异地同步、断点续传、异构同步
    数据库同步的正确打开方式
    使用SyncNavigator实现数据库异地同步。
    聊聊MySQL主从数据库同步的那些事儿
    高并发架构系列:数据库主从同步的3种一致性方案实现,及优劣比较
    MySQL binlog数据库同步技术总结
    数据库同步的两种方式
    某省肿瘤医院 — 数据备份 + 数据库同步
  • 原文地址:https://www.cnblogs.com/pangxiaox/p/7080015.html
Copyright © 2011-2022 走看看