Php 在RESTful API中使用干净的URL

Php 在RESTful API中使用干净的URL,php,rest,Php,Rest,“干净的URL”也称为“RESTful URL”,是用户友好的、纯结构的,并且不包含查询字符串。相反,它们只包含资源的路径 即:http://twitter.com/users/show/“+username+”.json” 有关服务器端功能的问题: 是否需要为每个目录创建唯一的服务器端API脚本 我可以将所有请求转发到一个脚本吗?如果可以,我该怎么做 从干净的URL结构中提取有用的信息($\u GET['URL\u structure']) 为什么twitter调用.json文件 这肯定不存在

“干净的URL”也称为“RESTful URL”,是用户友好的、纯结构的,并且不包含查询字符串。相反,它们只包含资源的路径

即:http://twitter.com/users/show/“+username+”.json”

有关服务器端功能的问题:

  • 是否需要为每个目录创建唯一的服务器端API脚本

  • 我可以将所有请求转发到一个脚本吗?如果可以,我该怎么做 从干净的URL结构中提取有用的信息($\u GET['URL\u structure'])

  • 为什么twitter调用.json文件 这肯定不存在。它必须根据请求生成。怎么 这行吗?这让我相信这个问题的答案 2是的

  • 1)如果您使用RESTful框架,或者在.htaccess文件中使用mod_重写规则,将所有API请求重定向到单个PHP文件(称为前端控制器),则情况并非如此

    .htaccess

    RewriteEngine On
    RewriteRule ^/api/ api.php
    
    RewriteEngine On
    RewriteRule ^/api/([^\.]+).(xml|json|atom) api.php?url=$1&type=$2
    
    api.php

    $request = $_SERVER['REQUEST_URI'];  //this would be /users/show/abc.json
    
    $request_parts = explode('/', $_GET['url']); // array('users', 'show', 'abc')
    $file_type     = $_GET['type'];
    
    $output = get_data_from_db(); //Do your processing here
                                  //You can outsource to other files via an include/require
    
    //Output based on request
    switch($file_type) {
        case 'json':
            echo json_encode($output);
            break;
        case 'xml':
            echo xml_encode($output); //This isn't a real function, but you can make one
            break;
        default:
            echo $output;
    }
    

    2)您可以使用apache的重写模块将所有api请求重定向到处理它们的特殊PHP文件。根据您的apache配置,原始请求的(RESTful)url将存储在PHP中的服务器变量中,我相信它是
    $\u server['REQUEST\u URI']
    。当然,您也可以将
    $\u GET[]
    变量传递给包含RESTful url的PHP

    .htaccess

    RewriteEngine On
    RewriteRule ^/api/ api.php
    
    RewriteEngine On
    RewriteRule ^/api/([^\.]+).(xml|json|atom) api.php?url=$1&type=$2
    
    api.php

    $request = $_SERVER['REQUEST_URI'];  //this would be /users/show/abc.json
    
    $request_parts = explode('/', $_GET['url']); // array('users', 'show', 'abc')
    $file_type     = $_GET['type'];
    
    $output = get_data_from_db(); //Do your processing here
                                  //You can outsource to other files via an include/require
    
    //Output based on request
    switch($file_type) {
        case 'json':
            echo json_encode($output);
            break;
        case 'xml':
            echo xml_encode($output); //This isn't a real function, but you can make one
            break;
        default:
            echo $output;
    }
    

    3)Twitter(和许多其他API)使用这种方式是因为它是一种方便的方式,可以提供应用程序期望从API返回的格式。所有API请求都被重新路由到一个PHP文件,该文件负责创建所有文件并将其内容回显到输出。该文件从未实际存储在服务器上(除非缓存)


    好资源

    RewriteEngine On
    RewriteRule ^/api/ api.php
    
    RewriteEngine On
    RewriteRule ^/api/([^\.]+).(xml|json|atom) api.php?url=$1&type=$2
    

    关于RecessPHP的说明。这当然是一个很好的工具,我会鼓励你看看它(也许从它的源头上了解它是如何处理事情的),但也就是说,它对我来说似乎有点笨重。路径名是用特殊注释编写的,这一事实对我来说似乎很难理解。我会偏离这一点,我不会称之为完美的框架,但这肯定是一个开始。祝你好运

    这对我很有用: 将其放入网站根目录下的htaccess文件中

    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule api/(.*)$ api/api.php?request=$1 [QSA,NC,L]
    RewriteRule (recipe/.*) api/app.php?request=$1 [QSA,NC,L]
    </IfModule>
    
    
    重新启动发动机
    重写cond%{REQUEST_FILENAME}-F
    重写cond%{REQUEST_FILENAME}-D
    重写规则api/(*)$api/api.php?请求=$1[QSA,NC,L]
    重写规则(recipe/*)api/app.php?请求=$1[QSA,NC,L]
    
    然后如果你进入页面 您将看到它将带您到位于的文件 我也有一个食谱页,我去使用 将其放入api.php文件中:

    <?php
    $requestParts = explode('/',$_GET['request']);
    $category = $requestParts[0];
    $action = $requestParts[1];
    $data = $requestParts[2];
    if($category == 'recipe'){
        include($_SERVER['DOCUMENT_ROOT'].'/pages/add_recipe.php');
    }
    
    试试这个:

    RewriteRule ^([^/]+)\/([^/]+)\/?$ getdata.php?para1=$1&para2=$2 [NC]
    

    干净的URL与RESTAPI无关。它们只是一种美化URL的好方法,否则会有难看的查询字符串。它们通常使用mod_rewrite实现,以获取干净的url,并在内部将其转换回查询字符串版本。感谢您的精彩回复。我通常会偏离框架,除非它能节省我很多时间。但我肯定会去看看。我也在寻找RESTful URL服务器端实现的技巧。我怀疑前面的控制员有牵连,谢谢澄清。这是一个很好的答案。@Bailey Parker::您提供的PHP框架链接不再有效:“注意:此域名于2017年10月29日过期,正在等待续订或删除。”