Mendeteksi tipe permintaan dalam PHP (GET, POST, PUT atau DELETE)

930

Bagaimana saya bisa mendeteksi tipe permintaan mana yang digunakan (GET, POST, PUT atau DELETE) di PHP?

UnkwnTech
sumber
21
jangan lupa HEAD =) (juga OPTIONS, TRACE dan CONNECT, tapi saya rasa PHP tidak pernah mendapatkannya).
gnud
4
Bagaimana dengan PATCH?
Pmpr
1
PATCH juga berfungsi dengan baik. $_SERVER['REQUEST_METHOD'] === 'PATCH'
ursuleacv

Jawaban:

1329

Dengan menggunakan

$_SERVER['REQUEST_METHOD']

Contoh

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

Untuk detail lebih lanjut silakan lihat dokumentasi untuk variabel $ _SERVER .

Agak
sumber
126
Beri +1 pada itu - ketika ragu, var_dump ($ _ SERVER) dan jawabannya sering ada di dalam.
Paul Dixon
10
Apa yang terjadi jika Anda POST ke mypage.php? Var = sesuatu?
nickf
2
Metode ini akan POST, tetapi jika Anda harus menggunakan $ _GET untuk mendapatkan variabel-variabel itu saya tidak yakin.
OIS
24
@NathanLong Dalam pengalaman saya itu tidak benar. Jika Anda POST ke mypage.php? Var = sesuatu maka 'sesuatu' akan masuk $_GET['var'].
David Gallagher
14
$_POSTdan $_GETsayangnya diberi nama. $_GETmengandung variabel dari komponen permintaan URL, terlepas dari metode HTTP. $_POSTakan berisi bidang formulir jika permintaan dikirim sebagai application/x-www-form-urlencoded.
Pj Dietz
223

REST di PHP bisa dilakukan dengan sangat sederhana. Buat http://example.com/test.php (diuraikan di bawah). Gunakan ini untuk panggilan REST, mis . Http://example.com/test.php/testing/123/hello . Ini berfungsi dengan Apache dan Lighttpd di luar kotak, dan tidak ada aturan penulisan ulang yang diperlukan.

<?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;
}
neu242
sumber
20
Jika Anda ingin API Anda tersedia, tanpa mengutip mesin penginterpretasi apa yang Anda gunakan, tambahkan file .htaccess yang mengandung RewriteEngine di RewriteRule ^ api /(.*)$ api.php / $ 1 Ini mengasumsikan file API Anda disebut api. php Juga, sejak blok kode di atas ditulis, pengembang PHP telah mendepresiasi fungsi pemisahan. itu berfungsi dengan baik jika Anda mengganti split dengan meledak.
JonTheNiceGuy
10
Ada apa dengan @di depan $_SERVER['PATH_INFO']?
Svish
10
@Vish, detail luar biasa yang Anda perhatikan! Itu menghilangkan PHP Notice: Undefined index: PATH_INFOjika PATH_INFO tidak ada $_SERVER. Saya menambahkan ini ke tas trik saya segera! Ini adalah cara untuk mengatakan "Saya tahu mungkin tidak ada entri yang bernama seperti itu dalam array ini, dan saya siap untuk itu, jadi diam dan lakukan apa yang saya katakan kepada Anda". :) Terima kasih teman-teman, baik untuk memposting jawaban ini dan untuk membawa perhatian saya pada karakter tertentu di dalamnya.
inkredibl
16
Saya biasanya menggunakan! Kosong, bukan @. Latihan yang lebih baik?
geilt
8
Sebagai cara yang lebih ringkas menggunakan metode variabel: <?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

Mendeteksi metode HTTP atau yang disebut REQUEST METHODbisa dilakukan dengan menggunakan potongan kode berikut.

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

Anda juga bisa melakukannya menggunakan switchjika Anda lebih suka ini daripada if-elsepernyataan.

Jika metode selain GETatau POSTdiperlukan dalam formulir HTML, ini sering diselesaikan dengan menggunakan bidang tersembunyi di formulir.

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

Untuk informasi lebih lanjut mengenai metode HTTP, saya ingin merujuk pada pertanyaan StackOverflow berikut:

PUT dan DELETE protokol HTTP dan penggunaannya dalam PHP

Peter
sumber
12

Kami juga dapat menggunakan input_filter untuk mendeteksi metode permintaan sambil juga menyediakan keamanan melalui sanitasi input.

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

Karena ini tentang REST, hanya mendapatkan metode permintaan dari server tidak cukup. Anda juga perlu menerima parameter rute yang tenang. Alasan untuk memisahkan parameter RESTful dan parameter GET / POST / PUT adalah bahwa sumber daya perlu memiliki URL unik untuk identifikasi.

Inilah salah satu cara menerapkan rute RESTful di PHP menggunakan Slim:

https://github.com/codeguy/Slim

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

Dan konfigurasikan server sesuai.

Berikut contoh lain menggunakan 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');
nurettin
sumber
Bukan apa yang diminta OP. Dan juga, OP tidak menyebutkan REST di mana pun.
Bruno Ferreira
@BrunoFerreira Anda ingin saya menghapus jawaban karena OP tidak secara khusus menggunakan istilah REST?
nurettin
7

Sangat Sederhana, cukup gunakan $ _SERVER ['REQUEST_METHOD'];

Contoh:

<?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;
}
?>
Junari Ansari
sumber
1
Kasus "DELETE" tidak akan pernah terkena karena itu bukan REQUEST_METHOD yang mungkin. REQUEST_METHODs yang valid adalah 'GET', 'HEAD', 'POST', 'PUT'. Baca dokumentasi (ditunjukkan dalam berbagai jawaban di halaman ini) sebelum mengirim jawaban.
Patrick
1
@ Patrick, sebenarnya, kasus "HAPUS" akan mendapatkan hit ketika metode permintaan HAPUS; namun dokumentasi dalam PHP tidak menyebutkannya. Memang, metode apa pun akan tercermin $_SERVER['REQUEST_METHOD'], bahkan yang disesuaikan. Ingat bahwa metode ini hanya string di header permintaan dan itu adalah tugas kami untuk memeriksa kebenarannya.
Ivan De Paz Centeno
1
@Patrick DELETE didefinisikan dalam RFC7231 dan didukung di semua browser utama. tools.ietf.org/html/rfc7231#section-4.3.5 dan $ _SERVER ["REQUEST_METHOD"] hanyalah sebuah string.
Robert Talada
@IvanDePazCenteno Tepat. Jangan pernah mempercayai input pengguna. Jangan pernah mempercayai input pengguna.
Robert Talada
6
$request = new \Zend\Http\PhpEnvironment\Request();
$httpMethod = $request->getMethod();

Dengan cara ini Anda juga bisa mencapainya di zend framework 2 juga. Terima kasih.

Amit Patange
sumber
Anda dapat membuat di controller $ request = $ this-> getRequest (). Dan kemudian, $ request-> isPost (). Lihat juga $ request-> getMethod ().
Vasiliy Toporov
4

Di core php Anda bisa melakukan ini:

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


?>
Shaan Ansari
sumber
1

Penting juga untuk dicatat, bahwa PHP akan mengisi semua $_GETparameter bahkan ketika Anda mengirim permintaan yang tepat dari jenis lainnya.

Metode di balasan atas adalah sepenuhnya benar, namun jika Anda ingin additionaly cek untuk GETparameter sambil menangani POST, DELETE, PUT, dll permintaan, Anda perlu memeriksa ukuran $_GETarray yang.

Karol Sobański
sumber
0

Ketika suatu metode diminta, ia akan memiliki array. Jadi cukup periksa count().

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

3v4l.org/U51TE

Sangat berbahaya
sumber
0

Saya menggunakan kode ini. Itu harus bekerja.

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

Kode di atas ini akan bekerja dengan REST calls dan juga akan bekerja denganhtml form

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

Anda bisa mendapatkan data string kueri apa pun www.example.com?id=2&name=r

Anda harus mendapatkan data menggunakan $_GET['id']atau$_REQUEST['id'] .

Mengirim data berarti formulir <form action='' method='POST'>yang harus Anda gunakan $_POSTatau $_REQUEST.

Teknologi Rocker
sumber