PHP'de istek türünü algılama (GET, POST, PUT veya DELETE)


929

PHP'de hangi istek türünün kullanıldığını (GET, POST, PUT veya DELETE) nasıl algılayabilirim?


21
HEAD =) unutmayın (ayrıca SEÇENEKLER, TRACE ve CONNECT, ama PHP hiç bunları alır sanmıyorum).
gnud

4
Nasıl PATCH?
Pmpr

1
PATCH ayrıca iyi çalışıyor. $_SERVER['REQUEST_METHOD'] === 'PATCH'
ursuleacv

Yanıtlar:


1327

Kullanarak

$_SERVER['REQUEST_METHOD']

Misal

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

Daha fazla ayrıntı için lütfen $ _SERVER değişkeninin belgelerine bakın .


126
Buna +1 - kuşku duyduğunuzda, var_dump ($ _ SERVER) ve cevap genellikle içeride.
Paul Dixon

10
Mypage.php adresine POST yaparsanız ne olur? Var = bir şey?
nickf

2
Yöntem POST olacaktır, ancak bu değişkenleri almak için $ _GET kullanmanız gerekiyorsa Emin değilim.
OIS

24
@NathanLong Deneyimlerime göre bu yanlış. Mypage.php? Var = bir şeye POST yaparsanız, o zaman 'bir şey' olacaktır $_GET['var'].
David Gallagher

14
$_POSTve $_GETne yazık ki adlandırılmış. $_GETHTTP yönteminden bağımsız olarak URL'nin sorgu bileşenindeki değişkenleri içerir. $_POSTistek olarak gönderildiyse form alanlarını içerir application/x-www-form-urlencoded.
Pj Dietz

223

PHP REST oldukça basit yapılabilir. Create http://example.com/test.php (aşağıda açıklanmıştır). REST çağrıları için bunu kullanın, örneğin http://example.com/test.php/testing/123/hello . Bu, kutunun dışında Apache ve Lighttpd ile çalışır ve yeniden yazma kurallarına gerek yoktur.

<?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'nızın kullanılabilir olmasını istiyorsanız, hangi yorumlama motorunu kullandığınızı belirtmeden, RewriteRule ^ api /(.*)$ api.php / $ 1 üzerinde RewriteEngine içeren bir .htaccess dosyası ekleyin. API dosyanızın API adı verildiğini varsayar. php. Ayrıca, yukarıdaki kod bloğu yazıldığından beri, PHP geliştiricileri bölünmüş işlevi amortismana tabi tutmuştur. bölmeyi patla ile değiştirirseniz iyi çalışır.
JonTheNiceGuy

10
@Önünde ne var $_SERVER['PATH_INFO']?
Svish

10
@Svish, ne harika bir ayrıntı fark ettin! PHP Notice: Undefined index: PATH_INFOPATH_INFO içeri girmezse kurtulur $_SERVER. Bunu hemen hileler çantama ekliyorum! "Ben bu dizide bu şekilde adlandırılmış bir giriş olmayabilir biliyorum ve bunun için hazırım, bu yüzden sadece çeneni kapat ve sana söylediklerimi yap" demenin bir yolu. :) Teşekkürler çocuklar, hem bu yanıtı yayınladığım için hem de dikkatimi o karaktere getirdiğim için.
inkredibl

16
Genellikle @ yerine! Boş kullanırım. Daha iyi uygulama?
geilt

8
Değişken yöntemleri kullanarak daha özlü bir yol olarak:<?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 yönteminin veya böyle bir yöntemin algılanması, REQUEST METHODaşağıdaki kod snippet'i kullanılarak yapılabilir.

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

Bunu switchtercih ederseniz,if-else deyim .

Bir HTML formunda GETveya dışında bir yöntem POSTgerekiyorsa, bu genellikle formdaki gizli bir alan kullanılarak çözülür.

<!-- 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 yöntemleri hakkında daha fazla bilgi için aşağıdaki StackOverflow sorusuna başvurmak istiyorum:

HTTP protokolünün PUT ve DELETE ve PHP'de kullanımları


12

Girdi_filterini istek girişini algılamak için kullanabilirken, aynı zamanda girdi sanitasyonu yoluyla güvenlik de sağlayabiliriz.

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

10

Bu REST ile ilgili olduğundan, sadece istek yöntemini sunucudan almak yeterli değildir. Ayrıca RESTful rota parametrelerini de almanız gerekir. RESTful parametrelerini ve GET / POST / PUT parametrelerini ayırmanın nedeni, bir kaynağın tanımlama için kendi benzersiz URL'sine sahip olması gerektiğidir.

İşte Slim kullanarak PHP RESTful yolları uygulamak için bir yol:

https://github.com/codeguy/Slim

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

Ve sunucuyu buna göre yapılandırın.

AltoRouter kullanan başka bir örnek:

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'nin istediği şey değil. Ve ayrıca OP hiçbir yerde REST'ten bahsetmedi.
Bruno Ferreira

@BrunoFerreira OP özellikle REST terimini kullanmadığı için cevabı silmemi ister misiniz?
nurettin


7

Çok Basit sadece $ _SERVER ['REQUEST_METHOD'] kullanın;

Misal:

<?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" durumu hiçbir zaman isabet edilmeyecektir çünkü bu olası bir REQUEST_METHOD değildir. Geçerli REQUEST_METHOD'lar 'GET', 'HEAD', 'POST', 'PUT'. Bir cevap göndermeden önce belgeleri (bu sayfada çok sayıda cevaba işaret ederek) okuyun.
Patrick

1
@Patrick, aslında, "DELETE" durumu istek yöntemi DELETE olduğunda isabet alacaktır; yine de PHP'deki belgeler bundan bahsetmez. Gerçekten, herhangi bir yöntem $_SERVER['REQUEST_METHOD'], hatta özelleştirilmiş yöntemlere yansıtılır . Yöntemin istek üstbilgisinde yalnızca bir dize olduğunu ve doğruluğunu kontrol etmek bizim görevimiz olduğunu unutmayın.
Ivan De Paz Centeno

1
@Patrick DELETE, RFC7231'de tanımlanmıştır ve tüm büyük tarayıcılarda desteklenir. tools.ietf.org/html/rfc7231#section-4.3.5 ve $ _SERVER ["REQUEST_METHOD"] sadece bir dizedir.
Robert Talada

@IvanDePazCenteno Kesinlikle. Kullanıcı girişine asla güvenme. Kullanıcı girişine asla güvenme.
Robert Talada

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

Bu şekilde zend framework 2'de de başarabilirsiniz. Teşekkürler.


Denetleyicide $ request = $ this-> getRequest () yapabilirsiniz. Ve sonra, $ request-> isPost (). Ayrıca $ request-> getMethod () öğesine de göz atın.
Vasiliy Toporov

4

Çekirdek php'de şöyle yapabilirsiniz:

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

Ayrıca, PHP'nin tüm $_GET , başka türden uygun bir istek gönderirken bile parametreleri .

Yukarıdaki yanıtlarda Yöntemleri için Additionaly çek istiyorum ancak eğer tamamen doğru GETişlerken parametreleri POST, DELETE, PUTvb isteği, sen boyutunu kontrol etmek gerek $_GETdizide.


0

Bir yöntem istendiğinde bir array. Sadece kontrol edin count().

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

3v4l.org/U51TE


0

Bu kodu kullandım. İşe yaramalı.

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

Bu yukarıdaki kod ile çalışacak REST callsve aynı zamanda çalışacaktırhtml form

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

-4

Herhangi bir sorgu dizesi verisi alabilirsiniz. www.example.com?id=2&name=r

Sen kullanarak verileri almak gerekir $_GET['id']veya $_REQUEST['id'].

Formu gibi Gönderi veri araçları <form action='' method='POST'>kullanmak gerekir $_POSTya $_REQUEST.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.