创建Restful API应该在响应之前放置哪种标头? [英] Creating Restful API what kind of headers should be put out before the response?

查看:128
本文介绍了创建Restful API应该在响应之前放置哪种标头?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我没有找到关于此的大量信息,也许我只是在搜索错误,谁知道..我想知道或试图弄清楚我应该为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函数 api.php

<?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.php .htaccess 的文件c $ c>和 Rest.inc.php

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

localhost/about

其中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.php Rest.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

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

Note. Place the .htaccess in the same folder.

并且这两个文件位于同一目录中。目录应该放在htaccess的 RewriteBase

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.

这篇关于创建Restful API应该在响应之前放置哪种标头?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆