我已经构建了我的第一个RESTful API,并使用Slim作为我的框架。到目前为止它运作良好。
现在我已经看到了一个很棒的API设计指南,其中解释说,构建API的最佳方法是保持水平不变。我想这样做并尝试弄清楚如何构建这样的URI:
my-domain.int/groups/search?q=my_query
/ groups部分已经可以使用GET,POST,PUT,DELETE,搜索查询的工作原理如下:
my-domain.int/groups/search/my_query
这是我在PHP中用于路由的代码:
$app->get('/groups/search/:query', 'findByName');
我无法弄清楚如何使用Slim中的问号构建可选参数。我无法在谷歌上找到任何东西。
编辑: 由于搜索似乎不适合我的场景,我试图展示我想要实现的另一种方式:
我想说我想从API获得部分回复。请求看起来应该是这样的:
my-domain.int/groups?fields=name,description
不是那样的:
my-domain.int/groups/fields/name/description
如何在路由中实现这一点?
答案 0 :(得分:6)
查询字符串提供的参数GET参数不必在route参数中指定。框架将尝试匹配没有这些值的URI。要访问GET参数,您可以使用标准 php方法,该方法使用超级全局$_GET:
$app->get('/groups/test/', function() use ($app) {
if (isset($_GET['fields']){
$test = $_GET('fields');
echo "This is a GET route with $test";
}
});
或者你可以使用框架的方法,正如@Raphael在他的回答中提到的那样:
$app->get('/groups/test/', function() use ($app) {
$test = $app->request()->get('fields');
echo "This is a GET route with $test";
});
答案 1 :(得分:4)
好的,我找到了一个在http://help.slimframework.com/discussions/problems/844-instead
上做我需要的例子如果要构建像
这样的URI样式home.int/groups/test?fields=name,description
你需要像这样建立一个溃败
$app->get('/groups/test/', function() use ($app) {
$test = $app->request()->get('fields');
echo "This is a GET route with $test";
});
它呼应: 这是一个名称为描述的GET路由
即使它至少不是数组,我也可以使用问号。使用通配符我必须使用/
答案 2 :(得分:1)
您可能还有可选的路线参数。这些是使用一条路线进行博客存档的理想选择。要声明可选的路由参数,请指定您的路由模式:
<?php
$app = new Slim();
$app->get('/archive(/:year(/:month(/:day)))', function ($year = 2010, $month = 12, $day = 05) {
echo sprintf('%s-%s-%s', $year, $month, $day);
});
每个后续路段都是可选的。此路由将接受以下的HTTP请求:
/archive
/archive/2010
/archive/2010/12
/archive/2010/12/05
如果HTTP请求中省略了可选路由段,则使用回调签名中的默认值。
答案 3 :(得分:0)
搜索查询不适用于url参数,因为搜索字符串可能包含url分隔符(在您的情况下为/
)。将它作为查询参数保持没有错,你不必在任何地方推广这个概念。
但是要回答你的问题,可选参数将作为另一个网址解决:
$app->get('/groups/search/:query', 'findByName');
$app->get('/groups/search/strict/:query', 'findByNameStrict');
编辑:似乎你想使用Slim的通配符路由。你只需要确保只有一条路线的间隔。
$app->get('/groups/fields/:fields+', 'getGroupsFiltered');
参数$fields
将是一个数组。