我的Slim API给了我一个404错误页面

时间:2016-01-16 00:28:11

标签: php slim

我正在为我的角应用程序制作API,这将允许我使用Slim访问我的数据库。我按照本教程http://anjanawijesundara.blogspot.ca/2015/04/crud-application-with-angularjs.html

进行了操作

我有一个'Angularjs'文件夹。在其中,我有我的index.html文件,我的'api'文件夹,这是这个API,我的'app'文件夹,用于角应用程序,以及'assets'文件夹,用于css,img和其他js文件。

我在带有composer的'API'文件夹中安装了Slim(它创建了一个供应商文件夹),并且我在vendor文件夹旁边有一个'index.php'文件。

我的'index.php'文件(在api文件夹中)到目前为止看起来像这样:

<?php
require 'vendor/autoload.php';

$app = new \Slim\App;

$app->get('/Types', 'getTypes');
$app->get('/Types/:id', 'getTypeById');

$app->run();

function DB_Connection() {  
    $dbhost = "localhost";
    $dbuser = "kevdug_portfolio";
    $dbpass = "*****************";
    $dbname = "portfolio";
    $dbh = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);  
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    return $dbh;
}

function getTypes() {
    $sql = "select * FROM pt_type";
    try {
        $db = DB_Connection();
        $stmt = $db->query($sql);  
        $list = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db = null;
        echo json_encode($list);
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    }
}

function getTypeById($id) {
    $sql = "select * FROM pt_type WHERE id=".$id;
    try {
        $db = DB_Connection();
        $stmt = $db->query($sql);  
        $list = $stmt->fetchAll(PDO::FETCH_OBJ);
        $db = null;
        echo json_encode($list);
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}'; 
    }
}

?>

我想我可以在这段代码中使用我的API:

angular.module('appDatabaseCtrl', [])
.controller('databaseCtrl', ['$scope','$routeParams', '$http', '$log',
    function($scope, $routeParams, $http, $log){
        $scope.testDatabaseTypes = function(){
            $http.get('/api/Types').success(function(data) {
                $log.info("succes!");
                $log.log(data);
            })
            .error(function (data, status){
                $log.error("error!");
                $log.log(data);
            });
        };
        $scope.testDatabaseTypesById = function(){
            console.log($scope.id);
            $http.get('/api/Types/' + $scope.id).success(function(data) {
                $log.info("succes!");
                $log.log(data);
            })
            .error(function (data, status){
                $log.error("error!");
                $log.log(data);
            });
        };
    }
]);

第一个函数有效,但第二个函数返回404错误。您可以通过这些树网址查看自己发生了什么:

http://kevdug.webfactional.com/#/database

http://kevdug.webfactional.com/api/types

http://kevdug.webfactional.com/api/types/1&lt; ---可以是1到4之间的任何id

1 个答案:

答案 0 :(得分:0)

您似乎正在使用Slim v3(由$app = new \Slim\App;判断),但您的路线格式似乎是Slim v2的格式。

$app->get('/Types/:id', 'getTypeById');实际上应该更像$app->get('/Types/{id}', getTypeById);。您还可以对其接受的内容提供限制$app->get('/Types/{id:\d+}', getTypeById);

编辑:您还在使用Slim v3的无效功能签名,这就是导航到Your Example Url with the literal :id instead of a number it errors时的原因。你应该使用像

这样的函数签名
function getTypeById(\Slim\Http\Request $req, \Slim\Http\Response $res, $args) {
    $id = $args["id"]; // Rest of your code
}

最后,我建议查找一些基本的SQL注入保护教程,因为如果您当前的/ Types /:id路由正常工作,那么它将具有SQL注入漏洞。但是,由于这不是这个问题的目标,我只是留下警告。