创建 Restful API 在响应之前应该放出什么样的标头?

2022-01-17 00:00:00 http-headers rest php

我没有找到关于这方面的大量信息,也许我只是搜索错了,谁知道.. 我想知道或试图弄清楚我应该为 API 响应示例输出什么样的标头

I am not finding a whole lot of information on this, maybe I am just searching wrong, who knows.. What I want to know or try to figure out is what kind of headers should I output for API responses example

header('Content-Type: application/json');

我是否会针对数据类型提出一些内容,但是否还有其他关于时间、到期或其他我应该关注的事项?

Is something I would put out for the type of data, but are there others for time, expiration, or anything else for that matter that I should concern myself with?

最终,我正在尝试为我想要开发的应用程序创建一个 API,因此我试图尽早弄清楚什么是跨平台兼容的以及什么是需求,以便我可以尝试将它们构建到我的想法中标准开发的一部分

Ultimately I am attempting to make an API for an app I want to develope so I am trying to figure out early what will be cross platform compliant and what needs are so I can try to build them into my idea of what would be part of standard dev

推荐答案

这就是你想要的.

主文件:Rest.inc.php

<?php
    class REST {

        public $_allow = array();
        public $_content_type = "application/json";
        public $_request = array();

        private $_method = "";        
        private $_code = 200;

        public function __construct(){
            $this->inputs();
        }

        public function get_referer(){
            return $_SERVER['HTTP_REFERER'];
        }

        public function response($data,$status){
            $this->_code = ($status)?$status:200;
            $this->set_headers();
            echo $data;
            exit;
        }

        private function get_status_message(){
            $status = 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 ($status[$this->_code])?$status[$this->_code]:$status[500];
        }

        public function get_request_method(){
            return $_SERVER['REQUEST_METHOD'];
        }

        private function inputs(){
            switch($this->get_request_method()){
                case "POST":
                    $this->_request = $this->cleanInputs($_POST);
                    break;
                case "GET":
                    //break;
                case "DELETE":
                    $this->_request = $this->cleanInputs($_GET);
                    break;
                case "PUT":
                    parse_str(file_get_contents("php://input"),$this->_request);
                    $this->_request = $this->cleanInputs($this->_request);
                    break;
                default:
                    $this->response('',406);
                    break;
            }
        }        

        private function cleanInputs($data){
            $clean_input = array();
            if(is_array($data)){
                foreach($data as $k => $v){
                    $clean_input[$k] = $this->cleanInputs($v);
                }
            }else{
                if(get_magic_quotes_gpc()){
                    $data = trim(stripslashes($data));
                }
                $data = strip_tags($data);
                $clean_input = trim($data);
            }
            return $clean_input;
        }        

        private function set_headers(){
            header("HTTP/1.1 ".$this->_code." ".$this->get_status_message());
            header("Content-Type:".$this->_content_type);
        }
    }    
?>

文件api.php中的API函数

<?php
    error_reporting(E_ALL ^ E_DEPRECATED);
    require_once("Rest.inc.php");

    class API extends REST {

        public $data = "";

        const DB_SERVER = "host";
        const DB_USER = "username";
        const DB_PASSWORD = "asdfgf";
        const DB = "database name";

        private $db = NULL;

        public function __construct(){
            parent::__construct();                // Init parent contructor
            $this->dbConnect();                    // Initiate Database connection
        }

        /*
           Database connection 
        */
        private function dbConnect(){
            $this->db = mysql_pconnect(self::DB_SERVER,self::DB_USER,self::DB_PASSWORD);
            if (!$this->db)
            {
              echo "Please try later.";
            }
            if($this->db)
                mysql_select_db(self::DB,$this->db);
        }

        /*
         * Public method for access api.
         * This method dynmically call the method based on the query string
         *
         */
        public function processApi(){
            $func = strtolower(trim(str_replace("/","",$_REQUEST['rquest'])));
            if((int)method_exists($this,$func) > 0)
                $this->$func();
            else
                $this->response('',400);                // If the method not exist with in this class, response would be "Page not found".
        }

        /*************API SPACE START*******************/

        private function about(){

            if($this->get_request_method() != "POST"){
                $error = array('status' => 'WRONG_CALL', "msg" => "The type of call cannot be accepted by our servers.");
                $error = $this->json($error);
                $this->response($error,406);
            }
            $data = array('version' => '0.1', 'desc' => 'This API is created by Blovia Technologies Pvt. Ltd., for the public usage for accessing data about vehicles.');
            $data = $this->json($data);
            $this->response($data,200);

        }



        /*************API SPACE END*********************/

        /*
            Encode array into JSON
        */
        private function json($data){
            if(is_array($data)){
                return json_encode($data, JSON_PRETTY_PRINT);
            }
        }

    }

    // Initiiate Library

    $api = new API;
    $api->processApi();
?>

现在终于配置.htaccess

在放置 api.phpRest.inc.php 的同一文件夹中创建一个名为 .htaccess 的文件

Create a file named .htaccess in the same folder where you place api.php and Rest.inc.php

RewriteBase /
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule ^(.*)$ api.php?rquest=$1 [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*)$ api.php [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME} -s
RewriteRule ^(.*)$ api.php [QSA,NC,L]   

现在调用你的 API

Now call your API like

localhost/about

函数在哪里.您可以在函数内部动态检查是GET还是POST,并根据需要发送响应文本和代码.我已经完全给了你你想要的.

where about is the function. You can dynamically check whether it is GET or POST inside the function, and send response text and codes as required. I have given you entirely what you want.

考虑到 api.phpRest.inc.php 都在/,(即 RewriteBase.htaccess 文件)

Considering api.php and Rest.inc.php are both in /, (that is what in RewriteBase in .htaccess file)

如果要将文件放在其他目录或文件夹中,例如 /beta/v1/

If you want to place the files in some other directory or folder, for example /beta/v1/

RewriteBase/ 更改为 /beta/v1

Change the RewriteBase from / to /beta/v1

注意.将 .htaccess 放在同一个文件夹中.

Note. Place the .htaccess in the same folder.

而且这两个文件在同一个目录下.目录应该放在RewriteBase中的htaccess中

And both the files in the same directory. The directory should be placed in the htaccess in RewriteBase

如果您在理解上述内容时有任何问题,请告诉我.

If you have any issues understanding the above, let me know.

相关文章