在 PHP 中添加执行 GET 和 POST 请求所需的参数值
Add required parameter values for perform GET and POST request in PHP
我正在尝试弄清楚如何使我的实际 Slim php 应用程序变得更有用和复杂(是的,我正在尝试执行类似非常简单的 APIrest 服务的操作),我在其中执行了一些不同类型的请求,一些作为 GET 请求,一些作为 POST 请求:
获取所有图书的 GET 请求 object
$app->get('/api/books', function () {
require_once('db/connector_test.php');
$statement = $pdo->prepare("SELECT * FROM books ORDER BY id");
$statement->execute();
$data = $statement->fetchAll(PDO::FETCH_OBJ);
if (isset($data)) {
echo "<pre>";
header('Content-Type: application/json');
print json_encode($data);
echo "</pre>";
}
});
在这种情况下,我已经在 GET 请求中的特定 '/api/books/{id}'
url 之后执行了另一个 GET 请求来检索特定图书 object 数据,结果非常简单结果:
POST 请求插入新记录
$app->post('/api/books', function ($request) {
require_once('db/connector_test.php');
$statement = $pdo->prepare("INSERT INTO `books` (`title`, `author`, `amazon_url`) VALUES (:stitle,:sauthor,:samazon_url)");
//$statement->bindParam(':title',':author',':amazon_url', $title, $author, $amazon_url);
$statement->execute(array(
"stitle" => $request->getParsedBody()['title'],
"sauthor" => $request->getParsedBody()['author'],
"samazon_url" => $request->getParsedBody()['amazon_url']
));
在这种情况下,我刚刚使用 Postman client 对其进行了测试,方法是将三个参数(标题、作者、amazon_url)添加为 Body 参数,其中包含我要添加的值在执行 POST 请求的数据库中。
我现在需要做什么? (这就是这个问题的重点)
我考虑过一些可以使这些 HTTP 请求更安全的方法,也许可以通过在每个请求中添加一些必需的参数来更好地控制使用这些资源……比如 authkey 或一些特定的强制参数。因此,想要对这些资源发出 GET 和 POST 请求的普通用户需要知道需要哪种参数值。
有人可以建议我如何在 Slim 和 PHP 中包含这个逻辑吗?因为我认为如果我在 PHP 中理解这个概念,我也可以很容易地理解 Slim 框架。
所以您想对您的 API 进行某种身份验证
这可以在 slim Middleware in Slim
中使用中间件来完成
您可以在整个 API 周围或仅在特定路线周围建造出入口
在此中间件中,您可以使用此检查 JWT 令牌之类的令牌
Slim-JWT
您还可以检查用户的一些参数值
编辑以添加示例
首先你需要创建一个路由来生成JWT Token like
$app->get('/JWTToken',function($req,$res){
$MyJWT=$this->JWT;
$now = new DateTime();
$future = new DateTime("now +10 minutes");
// $server = $request->getServerParams();
$payload = [
"iat" => $now->getTimeStamp(),
"exp" => $future->getTimeStamp(),
"sub" =>"test for JWT",
];
$secret = "supersecretkeyyoushouldnotcommittogithub";
$token = $MyJWT->encode($payload, $secret, "HS512");
$data["status"] = "ok";
$data["token"] = $token;
return $res->withStatus(201)
->withHeader("Content-Type", "application/json")
->write(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
});
此路由将生成一个仅在 10 分钟内有效的 JWT 令牌
第二次添加中间件以检查令牌验证
$app->add(new \Slim\Middleware\JwtAuthentication([
"path" => ["/"],
"passthrough" => ["/JWTToken"],
"secret" => "supersecretkeyyoushouldnotcommittogithub",
"error" => function ($request, $response, $arguments) {
$data["status"] = "error";
$data["message"] = $arguments["message"];
return $response
->withHeader("Content-Type", "application/json")
->write(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
}
]));
此中间件将检查令牌是否有效
如果为 true 将调用您的 GET 或 POST 路由,否则将发送未经授权的错误返回
您需要根据这些要求更新您的 Composer
"firebase/php-jwt": "^4.0",
"tuupola/slim-jwt-auth": "^2.3"
编辑#2
要发送任何请求,您需要发送此 header
Authorization: Bearer "Token String"
我正在尝试弄清楚如何使我的实际 Slim php 应用程序变得更有用和复杂(是的,我正在尝试执行类似非常简单的 APIrest 服务的操作),我在其中执行了一些不同类型的请求,一些作为 GET 请求,一些作为 POST 请求:
获取所有图书的 GET 请求 object
$app->get('/api/books', function () {
require_once('db/connector_test.php');
$statement = $pdo->prepare("SELECT * FROM books ORDER BY id");
$statement->execute();
$data = $statement->fetchAll(PDO::FETCH_OBJ);
if (isset($data)) {
echo "<pre>";
header('Content-Type: application/json');
print json_encode($data);
echo "</pre>";
}
});
在这种情况下,我已经在 GET 请求中的特定 '/api/books/{id}'
url 之后执行了另一个 GET 请求来检索特定图书 object 数据,结果非常简单结果:
POST 请求插入新记录
$app->post('/api/books', function ($request) {
require_once('db/connector_test.php');
$statement = $pdo->prepare("INSERT INTO `books` (`title`, `author`, `amazon_url`) VALUES (:stitle,:sauthor,:samazon_url)");
//$statement->bindParam(':title',':author',':amazon_url', $title, $author, $amazon_url);
$statement->execute(array(
"stitle" => $request->getParsedBody()['title'],
"sauthor" => $request->getParsedBody()['author'],
"samazon_url" => $request->getParsedBody()['amazon_url']
));
在这种情况下,我刚刚使用 Postman client 对其进行了测试,方法是将三个参数(标题、作者、amazon_url)添加为 Body 参数,其中包含我要添加的值在执行 POST 请求的数据库中。
我现在需要做什么? (这就是这个问题的重点)
我考虑过一些可以使这些 HTTP 请求更安全的方法,也许可以通过在每个请求中添加一些必需的参数来更好地控制使用这些资源……比如 authkey 或一些特定的强制参数。因此,想要对这些资源发出 GET 和 POST 请求的普通用户需要知道需要哪种参数值。
有人可以建议我如何在 Slim 和 PHP 中包含这个逻辑吗?因为我认为如果我在 PHP 中理解这个概念,我也可以很容易地理解 Slim 框架。
所以您想对您的 API 进行某种身份验证 这可以在 slim Middleware in Slim
中使用中间件来完成您可以在整个 API 周围或仅在特定路线周围建造出入口 在此中间件中,您可以使用此检查 JWT 令牌之类的令牌 Slim-JWT
您还可以检查用户的一些参数值
编辑以添加示例
首先你需要创建一个路由来生成JWT Token like
$app->get('/JWTToken',function($req,$res){
$MyJWT=$this->JWT;
$now = new DateTime();
$future = new DateTime("now +10 minutes");
// $server = $request->getServerParams();
$payload = [
"iat" => $now->getTimeStamp(),
"exp" => $future->getTimeStamp(),
"sub" =>"test for JWT",
];
$secret = "supersecretkeyyoushouldnotcommittogithub";
$token = $MyJWT->encode($payload, $secret, "HS512");
$data["status"] = "ok";
$data["token"] = $token;
return $res->withStatus(201)
->withHeader("Content-Type", "application/json")
->write(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
});
此路由将生成一个仅在 10 分钟内有效的 JWT 令牌
第二次添加中间件以检查令牌验证
$app->add(new \Slim\Middleware\JwtAuthentication([
"path" => ["/"],
"passthrough" => ["/JWTToken"],
"secret" => "supersecretkeyyoushouldnotcommittogithub",
"error" => function ($request, $response, $arguments) {
$data["status"] = "error";
$data["message"] = $arguments["message"];
return $response
->withHeader("Content-Type", "application/json")
->write(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
}
]));
此中间件将检查令牌是否有效 如果为 true 将调用您的 GET 或 POST 路由,否则将发送未经授权的错误返回
您需要根据这些要求更新您的 Composer
"firebase/php-jwt": "^4.0",
"tuupola/slim-jwt-auth": "^2.3"
编辑#2 要发送任何请求,您需要发送此 header
Authorization: Bearer "Token String"