Làm cách nào tôi có thể phát hiện loại yêu cầu nào đã được sử dụng (GET, POST, PUT hoặc DELETE) trong PHP?
PATCH
?
$_SERVER['REQUEST_METHOD'] === 'PATCH'
Làm cách nào tôi có thể phát hiện loại yêu cầu nào đã được sử dụng (GET, POST, PUT hoặc DELETE) trong PHP?
PATCH
?
$_SERVER['REQUEST_METHOD'] === 'PATCH'
Câu trả lời:
Bằng cách sử dụng
$_SERVER['REQUEST_METHOD']
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// The request is using the POST method
}
Để biết thêm chi tiết, vui lòng xem tài liệu về biến $ _SERVER .
$_GET['var']
.
$_POST
và $_GET
có phần không may được đặt tên. $_GET
chứa các biến từ thành phần truy vấn của URL, bất kể phương thức HTTP. $_POST
sẽ chứa các trường mẫu nếu yêu cầu được gửi dưới dạng application/x-www-form-urlencoded
.
REST trong PHP có thể được thực hiện khá đơn giản. Tạo http://example.com/test.php (được nêu dưới đây). Sử dụng điều này cho các cuộc gọi REST, ví dụ: http://example.com/test.php/testing/123/hello . Điều này hoạt động với Apache và Lighttpd ngoài hộp và không cần quy tắc viết lại.
<?php
$method = $_SERVER['REQUEST_METHOD'];
$request = explode("/", substr(@$_SERVER['PATH_INFO'], 1));
switch ($method) {
case 'PUT':
do_something_with_put($request);
break;
case 'POST':
do_something_with_post($request);
break;
case 'GET':
do_something_with_get($request);
break;
default:
handle_error($request);
break;
}
@
phía trước $_SERVER['PATH_INFO']
?
PHP Notice: Undefined index: PATH_INFO
trong trường hợp không có PATH_INFO $_SERVER
. Tôi đang thêm cái này vào túi của tôi ngay lập tức! Đó là một cách để nói "Tôi biết có thể không có mục nào được đặt tên theo cách đó trong mảng này và tôi đã sẵn sàng cho điều đó, vì vậy hãy im lặng và làm những gì tôi nói với bạn". :) Cảm ơn các bạn, cả hai đã đăng câu trả lời này và đã khiến tôi chú ý đến nhân vật cụ thể trong đó.
<?php $request = explode("/", substr(@$_SERVER['PATH_INFO'], 1)); $rest = 'rest_'.strtolower($_SERVER['REQUEST_METHOD']); if (function_exists($rest)) call_user_func($rest, $request); ?>
Việc phát hiện phương thức HTTP hay còn gọi là REQUEST METHOD
có thể được thực hiện bằng đoạn mã sau.
$method = $_SERVER['REQUEST_METHOD'];
if ($method == 'POST'){
// Method is POST
} elseif ($method == 'GET'){
// Method is GET
} elseif ($method == 'PUT'){
// Method is PUT
} elseif ($method == 'DELETE'){
// Method is DELETE
} else {
// Method unknown
}
Bạn cũng có thể làm điều đó bằng cách sử dụng switch
nếu bạn thích điều này hơn if-else
câu lệnh.
Nếu một phương thức khác GET
hoặc POST
được yêu cầu trong biểu mẫu HTML, thì phương thức này thường được giải quyết bằng cách sử dụng trường ẩn trong biểu mẫu.
<!-- DELETE method -->
<form action='' method='POST'>
<input type="hidden" name'_METHOD' value="DELETE">
</form>
<!-- PUT method -->
<form action='' method='POST'>
<input type="hidden" name'_METHOD' value="PUT">
</form>
Để biết thêm thông tin về các phương thức HTTP, tôi muốn tham khảo câu hỏi StackOverflow sau đây:
PUT và DELETE của giao thức HTTP và cách sử dụng chúng trong PHP
Chúng tôi cũng có thể sử dụng input_filter để phát hiện phương thức yêu cầu đồng thời cung cấp bảo mật thông qua vệ sinh đầu vào.
$request = filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_ENCODED);
Vì đây là về REST, nên chỉ nhận phương thức yêu cầu từ máy chủ là không đủ. Bạn cũng cần nhận các tham số tuyến RESTful. Lý do để tách các tham số RESTful và tham số GET / POST / PUT là tài nguyên cần phải có URL duy nhất để nhận dạng.
Đây là một cách để thực hiện các tuyến RESTful trong PHP bằng Slim:
https://github.com/codeguy/Slim
$app = new \Slim\Slim();
$app->get('/hello/:name', function ($name) {
echo "Hello, $name";
});
$app->run();
Và cấu hình máy chủ phù hợp.
Đây là một ví dụ khác sử dụng AltoRouter:
https://github.com/dannyvankooten/AltoRouter
$router = new AltoRouter();
$router->setBasePath('/AltoRouter'); // (optional) the subdir AltoRouter lives in
// mapping routes
$router->map('GET|POST','/', 'home#index', 'home');
$router->map('GET','/users', array('c' => 'UserController', 'a' => 'ListAction'));
$router->map('GET','/users/[i:id]', 'users#show', 'users_show');
$router->map('POST','/users/[i:id]/[delete|update:action]', 'usersController#doAction', 'users_do');
Bạn có thể sử dụng getenv
hàm và không phải làm việc với một $_SERVER
biến:
getenv('REQUEST_METHOD');
Thêm thông tin:
Rất đơn giản chỉ cần sử dụng $ _SERVER ['REQUEST_METHOD'];
Thí dụ:
<?php
$method = $_SERVER['REQUEST_METHOD'];
switch ($method) {
case 'GET':
//Here Handle GET Request
break;
case 'POST':
//Here Handle POST Request
break;
case 'DELETE':
//Here Handle DELETE Request
break;
case 'PUT':
//Here Handle PUT Request
break;
}
?>
$_SERVER['REQUEST_METHOD']
, ngay cả những phương pháp tùy chỉnh. Hãy nhớ rằng phương thức này chỉ là một chuỗi trong tiêu đề yêu cầu và đó là nhiệm vụ của chúng tôi để kiểm tra tính chính xác của nó.
$request = new \Zend\Http\PhpEnvironment\Request();
$httpMethod = $request->getMethod();
Bằng cách này, bạn cũng có thể đạt được trong zend framework 2. Cảm ơn.
Trong lõi php bạn có thể làm như thế này:
<?php
$method = $_SERVER['REQUEST_METHOD'];
switch ($method) {
case 'GET':
//Here Handle GET Request
echo 'You are using '.$method.' Method';
break;
case 'POST':
//Here Handle POST Request
echo 'You are using '.$method.' Method';
break;
case 'PUT':
//Here Handle PUT Request
echo 'You are using '.$method.' Method';
break;
case 'PATCH':
//Here Handle PATCH Request
echo 'You are using '.$method.' Method';
break;
case 'DELETE':
//Here Handle DELETE Request
echo 'You are using '.$method.' Method';
break;
case 'COPY':
//Here Handle COPY Request
echo 'You are using '.$method.' Method';
break;
case 'OPTIONS':
//Here Handle OPTIONS Request
echo 'You are using '.$method.' Method';
break;
case 'LINK':
//Here Handle LINK Request
echo 'You are using '.$method.' Method';
break;
case 'UNLINK':
//Here Handle UNLINK Request
echo 'You are using '.$method.' Method';
break;
case 'PURGE':
//Here Handle PURGE Request
echo 'You are using '.$method.' Method';
break;
case 'LOCK':
//Here Handle LOCK Request
echo 'You are using '.$method.' Method';
break;
case 'UNLOCK':
//Here Handle UNLOCK Request
echo 'You are using '.$method.' Method';
break;
case 'PROPFIND':
//Here Handle PROPFIND Request
echo 'You are using '.$method.' Method';
break;
case 'VIEW':
//Here Handle VIEW Request
echo 'You are using '.$method.' Method';
break;
Default:
echo 'You are using '.$method.' Method';
break;
}
?>
Ngoài ra, cần lưu ý thêm rằng PHP sẽ điền vào tất cả các $_GET
tham số ngay cả khi bạn gửi một yêu cầu thích hợp thuộc loại khác.
Phương pháp trong bài trả lời ở trên là hoàn toàn đúng, tuy nhiên nếu bạn muốn additionaly kiểm tra cho GET
các thông số khi xử lý POST
, DELETE
, PUT
vv yêu cầu, bạn cần phải kiểm tra kích thước của $_GET
mảng.
Khi một phương thức được yêu cầu, nó sẽ có một array
. Vì vậy, chỉ cần kiểm tra với count()
.
$m=['GET'=>$_GET,'POST'=>$_POST];
foreach($m as$k=>$v){
echo count($v)?
$k.' was requested.':null;
}
Tôi đã sử dụng mã này. Nó nên hoạt động.
function get_request_method() {
$request_method = strtolower($_SERVER['REQUEST_METHOD']);
if($request_method != 'get' && $request_method != 'post') {
return $request_method;
}
if($request_method == 'post' && isset($_POST['_method'])) {
return strtolower($_POST['_method']);
}
return $request_method;
}
Mã ở trên sẽ làm việc với REST calls
và cũng sẽ làm việc vớihtml form
<form method="post">
<input name="_method" type="hidden" value="delete" />
<input type="submit" value="Submit">
</form>
Bạn có thể nhận được bất kỳ dữ liệu chuỗi truy vấn tức là www.example.com?id=2&name=r
Bạn phải lấy dữ liệu bằng cách sử dụng $_GET['id']
hoặc $_REQUEST['id']
.
Đăng dữ liệu có nghĩa là như hình thức <form action='' method='POST'>
bạn phải sử dụng $_POST
hoặc $_REQUEST
.