Phát hiện loại yêu cầu trong PHP (GET, POST, PUT hoặc DELETE)


930

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?


21
đừng quên CHÍNH =) (cũng là TÙY CHỌN, TRACE và KẾT NỐI, nhưng tôi không nghĩ PHP có được những thứ đó).
gnud

4
Thế còn PATCH?
Pmpr

1
VÒI cũng hoạt động tốt. $_SERVER['REQUEST_METHOD'] === 'PATCH'
ursuleacv

Câu trả lời:


1328

Bằng cách sử dụng

$_SERVER['REQUEST_METHOD']

Thí dụ

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 .


126
+1 cho điều đó - khi nghi ngờ, var_dump ($ _ SERVER) và câu trả lời thường nằm trong.
Paul Dixon

10
Điều gì xảy ra nếu bạn POST lên mypage.php? Var = cái gì đó?
nickf

2
Phương thức sẽ là POST, nhưng nếu bạn phải sử dụng $ _GET để lấy các biến đó thì tôi không chắc.
OIS

24
@NathanLong Theo kinh nghiệm của tôi thì không đúng. Nếu bạn POST lên mypage.php? Var = cái gì đó thì 'cái gì đó' sẽ xuất hiện $_GET['var'].
David Gallagher

14
$_POST$_GETcó phần không may được đặt tên. $_GETchứa các biến từ thành phần truy vấn của URL, bất kể phương thức HTTP. $_POSTsẽ 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.
Pj Dietz

223

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;
}

20
Nếu bạn muốn có sẵn API của mình, mà không trích dẫn công cụ thông dịch nào bạn đang sử dụng, hãy thêm tệp .htaccess chứa RewriteEngine trên RewriteRule ^ api /(.*)$ api.php / $ 1 Điều này giả sử tệp API của bạn được gọi là api. php. Ngoài ra, do khối mã trên được viết, các nhà phát triển PHP đã khấu hao chức năng phân tách. nó hoạt động tốt nếu bạn thay thế phân chia bằng phát nổ.
JonTheNiceGuy

10
Những gì với @phía trước $_SERVER['PATH_INFO']?
Svish

10
@Svish, thật là một chi tiết tuyệt vời mà bạn nhận thấy! Nó được loại bỏ PHP Notice: Undefined index: PATH_INFOtrong 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 đó.
inkredibl

16
Tôi thường sử dụng a! Trống thay vì @. Thực hành tốt hơn?
geilt

8
Như một cách ngắn gọn hơn bằng cách sử dụng các phương thức khác nhau: <?php $request = explode("/", substr(@$_SERVER['PATH_INFO'], 1)); $rest = 'rest_'.strtolower($_SERVER['REQUEST_METHOD']); if (function_exists($rest)) call_user_func($rest, $request); ?>
SandWyrm

21

Việc phát hiện phương thức HTTP hay còn gọi là REQUEST METHODcó 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 switchnếu bạn thích điều này hơn if-elsecâu lệnh.

Nếu một phương thức khác GEThoặ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


12

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);

10

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');

Không phải những gì OP yêu cầu. Ngoài ra, OP không đề cập đến REST ở bất cứ đâu.
Bruno Ferreira

@BrunoFerreira bạn có muốn tôi xóa câu trả lời vì OP không sử dụng cụ thể thuật ngữ REST không?
Nurettin


7

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;
}
?>

1
Trường hợp "XÓA" sẽ không bao giờ bị đánh vì đó không phải là REQUEST_METHOD. Các REQUEST_METHOD hợp lệ là 'GET', 'Head', 'POST', 'PUT'. Đọc tài liệu (được chỉ ra trong nhiều câu trả lời trên chính trang này) trước khi đăng câu trả lời.
Patrick

1
@Patrick, trên thực tế, trường hợp "XÓA" sẽ bị ảnh hưởng khi phương thức yêu cầu là XÓA; Tuy nhiên, tài liệu trong PHP không đề cập đến nó. Thật vậy, bất kỳ phương pháp nào cũng được phản ánh $_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ó.
Ivan De Paz Centeno

1
@Patrick DELETE được định nghĩa trong RFC7231 và được hỗ trợ trong tất cả các trình duyệt chính. tools.ietf.org/html/rfc7231#section-4.3.5 và $ _SERVER ["REQUEST_METHOD"] chỉ là một chuỗi.
Robert Talada

@IvanDePazCenteno Chính xác. Không bao giờ tin tưởng đầu vào của người dùng. Không bao giờ tin tưởng đầu vào của người dùng.
Robert Talada

6
$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.


Bạn có thể thực hiện trong trình điều khiển $ request = $ this-> getRequest (). Và sau đó, $ request-> isPost (). Kiểm tra thêm $ request-> getMethod ().
Vasiliy Toporov

4

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;
}


?>

1

Ngoài ra, cần lưu ý thêm rằng PHP sẽ điền vào tất cả các $_GETtham 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 GETcác thông số khi xử lý POST, DELETE, PUTvv yêu cầu, bạn cần phải kiểm tra kích thước của $_GETmảng.


0

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;
}

3v4l.org/U51TE


0

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 callsvà 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>

-4

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 $_POSThoặc $_REQUEST.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.