การตรวจจับประเภทคำขอใน PHP (GET, POST, PUT หรือ DELETE)


928

ฉันจะตรวจสอบประเภทคำขอที่ใช้ (GET, POST, PUT หรือ DELETE) ใน PHP ได้อย่างไร


20
อย่าลืม HEAD =) (เช่น OPTIONS TRACE และ CONNECT แต่ฉันไม่คิดว่า PHP จะได้รับสิ่งเหล่านี้)
gnud

4
แล้วไงPATCHล่ะ
Pmpr

1
แพทช์ยังใช้งานได้ดี $_SERVER['REQUEST_METHOD'] === 'PATCH'
ursuleacv

คำตอบ:


1326

โดยใช้

$_SERVER['REQUEST_METHOD']

ตัวอย่าง

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
     // The request is using the POST method
}

สำหรับรายละเอียดเพิ่มเติมโปรดดูเอกสารสำหรับตัวแปร $ _SERVER


126
+1 ถึงสิ่งนั้น - เมื่อมีข้อสงสัย var_dump ($ _ SERVER) และคำตอบมักอยู่ภายใน
Paul Dixon

10
จะเกิดอะไรขึ้นถ้าคุณโพสต์ที่ mypage.php? var = อะไร
nickf

2
วิธีการจะเป็น POST แต่ถ้าคุณต้องใช้ $ _GET เพื่อรับตัวแปรเหล่านั้นฉันไม่แน่ใจ
OIS

24
@NathanLong จากประสบการณ์ของฉันที่ไม่ถูกต้อง ถ้าคุณโพสต์ mypage.php? var = บางสิ่งบางอย่างแล้ว 'บางสิ่งบางอย่าง' $_GET['var']จะอยู่ใน
David Gallagher

14
$_POSTและ$_GETมีชื่อค่อนข้างน่าเสียดาย $_GETมีตัวแปรจากองค์ประกอบการสืบค้นของ URL โดยไม่คำนึงถึงวิธี HTTP จะมีเขตข้อมูลฟอร์มหากคำขอถูกส่งเป็น$_POST application/x-www-form-urlencoded
Pj Dietz

223

ส่วนที่เหลือใน PHP สามารถทำได้ค่อนข้างง่าย สร้างhttp://example.com/test.php (อธิบายไว้ด้านล่าง) ใช้สำหรับการโทร REST เช่นhttp://example.com/test.php/testing/123/hello สิ่งนี้ใช้ได้กับ Apache และ Lighttpd นอกกรอบและไม่จำเป็นต้องมีกฎการเขียนซ้ำ

<?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
หากคุณต้องการให้ API ของคุณพร้อมใช้งานโดยไม่ต้องพูดถึงเครื่องมือแปลภาษาที่คุณใช้อยู่ให้เพิ่มไฟล์. htaccess ที่มี RewriteEngine บน RewriteRule ^ api /(.*)$ api.php / $ 1 ซึ่งถือว่าไฟล์ API ของคุณเรียกว่า api PHP นอกจากนี้เนื่องจากโค้ดบล็อกข้างต้นถูกเขียนขึ้นผู้พัฒนา PHP จึงตัดค่าเสื่อมราคาของฟังก์ชัน มันทำงานได้ดีถ้าคุณแทนที่ split ด้วย explode
JonTheNiceGuy

10
มีอะไรกับ@ในด้านหน้าของ$_SERVER['PATH_INFO']?
Svish

10
@Svish รายละเอียดยอดเยี่ยมที่คุณสังเกตเห็นคืออะไร! มันได้รับกำจัดของPHP Notice: Undefined index: PATH_INFOในกรณี PATH_INFO $_SERVERไม่ได้อยู่ใน ฉันจะเพิ่มมันเข้าไปในกระเป๋าของฉันในทันที! มันเป็นวิธีการพูดว่า "ฉันรู้ว่าอาจไม่มีรายการที่ตั้งชื่อในวิธีนี้และฉันพร้อมแล้วดังนั้นเพียงปิดและทำในสิ่งที่ฉันบอกคุณ" :) ขอบคุณพวกคุณทั้งคู่ที่โพสต์คำตอบนี้และทำให้ฉันสนใจตัวละครตัวนั้นในนั้น
inkredibl

16
ฉันมักจะใช้! ว่างเปล่าแทน @ ปฏิบัติที่ดีกว่า
geilt

8
เป็นวิธีที่กระชับมากขึ้นโดยใช้วิธีตัวแปร: <?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

การตรวจจับวิธี HTTP หรือที่เรียกว่าREQUEST METHODสามารถทำได้โดยใช้ข้อมูลโค้ดต่อไปนี้

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

คุณสามารถทำได้โดยใช้ a switchหากคุณต้องการใช้if-elseคำสั่งนี้

หากวิธีการอื่นนอกเหนือจากGETหรือPOSTจำเป็นต้องใช้ในรูปแบบ HTML นี้มักจะมีการแก้ไขโดยใช้เขตข้อมูลที่ซ่อนอยู่ในแบบฟอร์ม

<!-- 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>

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธี HTTP ฉันต้องการอ้างถึงคำถาม StackOverflow ต่อไปนี้:

PUT และ DELETE ของโปรโตคอล HTTP และการใช้งานใน PHP


12

นอกจากนี้เรายังสามารถใช้input_filterในการตรวจสอบวิธีการร้องขอในขณะที่ยังให้ความปลอดภัยผ่านการสุขาภิบาลการป้อนข้อมูล

$request = filter_input(INPUT_SERVER, 'REQUEST_METHOD', FILTER_SANITIZE_ENCODED);

10

ตั้งแต่นี้เป็นเรื่องเกี่ยวกับ REST เพียงแค่ได้รับวิธีการร้องขอจากเซิร์ฟเวอร์ไม่เพียงพอ คุณต้องได้รับพารามิเตอร์เส้นทางที่สงบ เหตุผลในการแยกพารามิเตอร์ RESTful และพารามิเตอร์ GET / POST / PUT คือทรัพยากรจำเป็นต้องมี URL เฉพาะสำหรับการระบุ

นี่เป็นวิธีหนึ่งในการใช้เส้นทาง RESTful ใน PHP โดยใช้ Slim:

https://github.com/codeguy/Slim

$app = new \Slim\Slim();
$app->get('/hello/:name', function ($name) {
  echo "Hello, $name";
});
$app->run();

และกำหนดค่าเซิร์ฟเวอร์ให้สอดคล้อง

นี่เป็นอีกตัวอย่างหนึ่งที่ใช้ 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');

ไม่ใช่สิ่งที่ OP ขอ และ OP ไม่ได้พูดถึง REST ที่ใดก็ได้
Bruno Ferreira

@BrunoFerreira คุณต้องการให้ฉันลบคำตอบเนื่องจาก OP ไม่ได้ใช้คำว่า REST โดยเฉพาะหรือไม่
nurettin


7

มันง่ายมากเพียงใช้$ _SERVER ['REQUEST_METHOD'];

ตัวอย่าง:

<?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
กรณี "DELETE" จะไม่มีวันถูกกระทบเนื่องจากเป็นไปไม่ได้ที่ REQUEST_METHOD REQUEST_METHOD ที่ถูกต้องคือ 'GET', 'HEAD', 'POST', 'PUT' อ่านเอกสาร (ชี้ไปที่คำตอบมากมายในหน้านี้มาก) ก่อนโพสต์คำตอบ
Patrick

1
@Patrick ที่จริงแล้วกรณี "DELETE" จะได้รับผลกระทบเมื่อวิธีการร้องขอนั้นถูกลบ อย่างไรก็ตามเอกสารใน PHP ไม่ได้กล่าวถึง แน่นอนว่าวิธีการใดก็ได้รับการสะท้อน$_SERVER['REQUEST_METHOD']แม้แต่ที่กำหนดเอง โปรดจำไว้ว่าวิธีการนี้เป็นเพียงสตริงในส่วนหัวคำขอและเป็นหน้าที่ของเราในการตรวจสอบความถูกต้อง
Ivan De Paz Centeno

1
@Patrick DELETE ถูกกำหนดใน RFC7231 และรองรับในเบราว์เซอร์หลักทั้งหมด tools.ietf.org/html/rfc7231#section-4.3.5และ $ _SERVER ["REQUEST_METHOD"] เป็นเพียงสตริง
Robert Talada

@IvanDePazCenteno อย่างแน่นอน อย่าไว้ใจอินพุตของผู้ใช้ อย่าไว้ใจอินพุตของผู้ใช้
Robert Talada

6
$request = new \Zend\Http\PhpEnvironment\Request();
$httpMethod = $request->getMethod();

ด้วยวิธีนี้คุณสามารถบรรลุในกรอบ zend 2 ได้เช่นกัน ขอบคุณ


คุณสามารถสร้างได้ใน controller $ request = $ this-> getRequest () จากนั้น $ request-> isPost () ลองดู $ request-> getMethod ()
Vasiliy Toporov

4

ใน core php คุณสามารถทำสิ่งนี้:

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

มันมีประโยชน์ที่จะต้องทราบเพิ่มเติมว่า PHP จะเติม$_GETพารามิเตอร์ทั้งหมดแม้เมื่อคุณส่งคำขอประเภทอื่นที่เหมาะสม

วิธีการในการตอบข้างต้นถูกต้องสมบูรณ์ แต่ถ้าคุณต้องการที่จะตรวจสอบ additionaly สำหรับGETพารามิเตอร์ขณะที่การจัดการPOST, DELETE, PUTคำขอ ฯลฯ คุณจะต้องตรวจสอบขนาดของ$_GETอาร์เรย์


0

arrayเมื่อวิธีการที่ได้รับการร้องขอก็จะมี count()ดังนั้นเพียงแค่ตรวจสอบกับ

$m=['GET'=>$_GET,'POST'=>$_POST];
foreach($m as$k=>$v){
    echo count($v)?
    $k.' was requested.':null;
}

3v4l.org/U51TE


0

ฉันใช้รหัสนี้ มันควรจะทำงาน

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

รหัสข้างต้นนี้จะทำงานร่วมกับREST callsและจะทำงานร่วมกับhtml form

<form method="post">
    <input name="_method" type="hidden" value="delete" />
    <input type="submit" value="Submit">
</form>

-4

คุณสามารถรับข้อมูลสตริงข้อความค้นหาใด ๆ เช่น www.example.com?id=2&name=r

คุณต้องได้รับข้อมูลโดยใช้หรือ$_GET['id']$_REQUEST['id']

โพสต์หมายถึงข้อมูลเช่นแบบฟอร์ม<form action='' method='POST'>คุณต้องใช้หรือ$_POST$_REQUEST

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.