加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

愿这对你有所帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读