PHP에서 요청 유형 감지 (GET, POST, PUT 또는 DELETE)


928

PHP에서 사용 된 요청 유형 (GET, POST, PUT 또는 DELETE)을 어떻게 감지합니까?


20
HEAD =)를 잊지 마십시오 (옵션, TRACE 및 CONNECT도 있지만 PHP가 그런 것을 얻지 못한다고 생각합니다).
gnud December

4
어때요 PATCH?
Pmpr 2016 년

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에 POST하면 어떻게 되나요? var = something?
nickf December

2
메소드는 POST이지만 $ _GET을 사용하여 해당 변수를 가져와야하는 경우 확실하지 않습니다.
OIS

24
@NathanLong 내 경험상 그것은 틀렸다. mypage.php? var = something에 POST하면 'something'은에 있습니다 $_GET['var'].
David Gallagher 2012

14
$_POST그리고 $_GET다소 불행하게도 이름이 지정됩니다. $_GETHTTP 메소드에 관계없이 URL 쿼리 구성 요소의 변수를 포함합니다. $_POST요청이 (으)로 전송 된 경우 양식 필드를 포함합니다 application/x-www-form-urlencoded.
Pj Dietz

223

PHP의 REST는 매우 간단합니다. 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를 사용하려면 RewriteRule에 RewriteEngine을 포함하는 .htaccess 파일을 추가하십시오 ^ api /(.*)$ api.php / $ 1 API 파일을 api라고 가정합니다. PHP. 또한 위의 코드 블록이 작성되었으므로 PHP 개발자는 split 함수를 감가 상각했습니다. split을 explode로 바꾸면 제대로 작동합니다.
JonTheNiceGuy

10
@앞에 무엇입니까 $_SERVER['PATH_INFO']?
Svish

10
@Svish, 당신은 얼마나 훌륭한 세부 사항을 발견했습니다! PHP Notice: Undefined index: PATH_INFOPATH_INFO가에없는 경우 제거 됩니다 $_SERVER. 나는 이것을 속임수 가방에 바로 추가하고 있습니다! "이 배열에 그런 식으로 이름이 지정된 항목이 없을 수 있다는 것을 알고 있습니다. 준비가되었으므로 종료하고 지시 한 내용을 수행하십시오." :)이 답변을 게시하고 그 특정 인물에 관심을 가져 주셔서 감사합니다.
inkredibl

16
나는 보통 @ 대신! empty를 사용한다. 더 나은 연습?
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

REQUEST METHOD다음 코드 스 니펫을 사용하여 HTTP 메소드 또는 소위 감지를 수행 할 수 있습니다.

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

진술 switch보다 이것을 선호한다면 그것을 사용하여 그것을 할 수도 있습니다 if-else.

HTML 양식에 GET또는 이외의 방법 POST이 필요한 경우 양식의 숨겨진 필드를 사용하여 해결되는 경우가 많습니다.

<!-- 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 질문을 참조하고 싶습니다.

HTTP 프로토콜의 PUT 및 DELETE 및 PHP에서의 사용법


12

input_filter 를 사용하여 요청 방법을 감지하는 동시에 입력 위생을 통해 보안을 제공 할 수도 있습니다 .

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

10

이것은 REST에 관한 것이므로 서버에서 요청 메소드를 얻는 것만으로는 충분하지 않습니다. RESTful 라우트 매개 변수도 수신해야합니다. RESTful 매개 변수와 GET / POST / PUT 매개 변수를 분리하는 이유는 식별을 위해 자원에 고유 한 URL이 있어야하기 때문입니다.

Slim을 사용하여 PHP에서 RESTful 경로를 구현하는 한 가지 방법이 있습니다.

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

OP가 특별히 REST라는 용어를 사용하지 않았기 때문에 @BrunoFerreira 답을 삭제 하시겠습니까?
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
REQUEST_METHOD가 아니기 때문에 "DELETE"케이스는 절대로 히트되지 않습니다. 유효한 REQUEST_METHOD는 'GET', 'HEAD', 'POST', 'PUT'입니다. 답변을 게시하기 전에 설명서 (이 페이지의 많은 답변에서 지적 된)를 읽으십시오.
Patrick

1
@Patrick, 실제로 "DELETE"케이스는 요청 메소드가 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 정확합니다. 사용자 입력을 신뢰하지 마십시오. 사용자 입력을 신뢰하지 마십시오.
로버트 탈라 다

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

이런 식으로 zend framework 2에서도 달성 할 수 있습니다. 감사.


컨트롤러 $ request = $ this-> getRequest ()에서 만들 수 있습니다. 그런 다음 $ request-> isPost (). $ request-> getMethod ()도 확인하십시오.
Vasiliy Toporov

4

핵심 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.