+1 do tego - w razie wątpliwości var_dump ($ _ SERVER) i odpowiedź często leży w środku.
Paul Dixon,
10
Co się stanie, jeśli wyślesz POST do mypage.php? Var = coś?
nickf
2
Metodą będzie POST, ale jeśli musisz użyć $ _GET, aby uzyskać te zmienne, nie jestem pewien.
OIS
24
@NathanLong Z mojego doświadczenia wynika, że jest to nieprawidłowe. Jeśli wyślesz POST do mypage.php? Var = coś, wtedy będzie „coś” $_GET['var'].
David Gallagher,
14
$_POSTi $_GETsą niestety nazwane. $_GETzawierają zmienne z komponentu zapytania adresu URL, niezależnie od metody HTTP. $_POSTbędzie zawierać pola formularza, jeśli żądanie zostało wysłane jako application/x-www-form-urlencoded.
Jeśli chcesz mieć dostępne API bez cytowania, jakiego silnika interpretacji używasz, dodaj plik .htaccess zawierający RewriteEngine na RewriteRule ^ api /(.*)$ api.php / $ 1 Zakłada się, że plik API nazywa się api. php. Ponadto, ponieważ napisano powyższy blok kodu, programiści PHP zdeprecjonowali funkcję split. działa dobrze, jeśli zamienisz split na wybuch.
JonTheNiceGuy
10
Co jest z @przodu $_SERVER['PATH_INFO']?
Svish
10
@Svish, jaki wspaniały szczegół zauważyłeś! Pozbywa się PHP Notice: Undefined index: PATH_INFOna wypadek, gdyby PATH_INFO nie było $_SERVER. Od razu dodaję to do mojej torby sztuczek! Jest to sposób na powiedzenie „Wiem, że w tej tablicy może nie być wpisu o takiej nazwie i jestem na to gotowy, więc po prostu zamknij się i zrób to, co ci powiem”. :) Dzięki chłopaki, zarówno za opublikowanie tej odpowiedzi, jak i za zwrócenie mojej uwagi na tę konkretną postać.
inkredibl
16
Zwykle używam! Pustego zamiast @. Lepsza praktyka?
geilt
8
Jako bardziej zwięzły sposób przy użyciu metod zmiennych: <?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
Wykrywanie metody HTTP lub tzw. REQUEST METHODMoże być wykonane przy użyciu następującego fragmentu kodu.
$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}
Możesz to również zrobić za pomocą a, switchjeśli wolisz to od if-elseinstrukcji.
Jeśli w formularzu HTML wymagana jest metoda inna niż GETlub POST, często jest to rozwiązywane za pomocą ukrytego pola w formularzu.
<!-- DELETE method --><formaction=''method='POST'><inputtype="hidden"name'_METHOD'value="DELETE"></form><!-- PUT method --><formaction=''method='POST'><inputtype="hidden"name'_METHOD'value="PUT"></form>
Aby uzyskać więcej informacji dotyczących metod HTTP, chciałbym odnieść się do następującego pytania StackOverflow:
Ponieważ chodzi o REST, samo pobranie metody żądania z serwera nie wystarczy. Musisz także otrzymać parametry trasy RESTful. Powodem oddzielenia parametrów RESTful i GET / POST / PUT jest to, że zasób musi mieć swój własny unikalny adres URL do identyfikacji.
Oto jeden ze sposobów implementacji tras RESTful w PHP przy użyciu Slim:
Przypadek „DELETE” nigdy nie zostanie trafiony, ponieważ nie jest to możliwe REQUEST_METHOD. Prawidłowe REQUEST_METHOD to „GET”, „HEAD”, „POST”, „PUT”. Przeczytaj dokumentację (wskazaną w wielu odpowiedziach na tej samej stronie) przed opublikowaniem odpowiedzi.
Patrick
1
@ Patric, w rzeczywistości sprawa „DELETE” otrzyma trafienie, gdy metoda żądania to DELETE; jednak dokumentacja w PHP nie wspomina o tym. Rzeczywiście, każda metoda zostaje odzwierciedlona $_SERVER['REQUEST_METHOD'], nawet dostosowana. Pamiętaj, że metoda jest tylko ciągiem w nagłówku żądania i naszym zadaniem jest sprawdzenie jej poprawności.
Ivan De Paz Centeno
1
@Patrick DELETE jest zdefiniowany w RFC7231 i jest obsługiwany we wszystkich głównych przeglądarkach. tools.ietf.org/html/rfc7231#section-4.3.5 i $ _SERVER [„REQUEST_METHOD”] to tylko ciąg znaków.
Robert Talada
@IvanDePazCenteno Dokładnie. Nigdy nie ufaj wkładowi użytkownika. Nigdy nie ufaj wkładowi użytkownika.
Możesz zrobić w kontrolerze $ request = $ this-> getRequest (). A potem $ request-> isPost (). Sprawdź także $ request-> getMethod ().
Wasilij Toporow
4
W podstawowym php możesz to zrobić w następujący sposób:
<?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;}?>
Warto dodatkowo zauważyć, że PHP zapełni wszystkie $_GET parametry, nawet jeśli wyślesz odpowiednie żądanie innego typu.
Metody powyższych odpowiedzi są całkowicie poprawne, jednak jeśli chcesz dodatkowo odprawy dla GETparametrów podczas obsługi POST, DELETE, PUTitp wniosek, trzeba sprawdzić rozmiar $_GETtablicy.
PATCH
?$_SERVER['REQUEST_METHOD'] === 'PATCH'
Odpowiedzi:
Używając
Przykład
Aby uzyskać więcej informacji, zobacz dokumentację zmiennej $ _SERVER .
źródło
$_GET['var']
.$_POST
i$_GET
są niestety nazwane.$_GET
zawierają zmienne z komponentu zapytania adresu URL, niezależnie od metody HTTP.$_POST
będzie zawierać pola formularza, jeśli żądanie zostało wysłane jakoapplication/x-www-form-urlencoded
.REST w PHP można zrobić dość prosto. Utwórz http://example.com/test.php (opisane poniżej). Użyj tego do wywołań REST, np . Http://example.com/test.php/testing/123/hello . Działa to z Apache i Lighttpd po wyjęciu z pudełka i nie są wymagane żadne reguły przepisywania.
źródło
@
przodu$_SERVER['PATH_INFO']
?PHP Notice: Undefined index: PATH_INFO
na wypadek, gdyby PATH_INFO nie było$_SERVER
. Od razu dodaję to do mojej torby sztuczek! Jest to sposób na powiedzenie „Wiem, że w tej tablicy może nie być wpisu o takiej nazwie i jestem na to gotowy, więc po prostu zamknij się i zrób to, co ci powiem”. :) Dzięki chłopaki, zarówno za opublikowanie tej odpowiedzi, jak i za zwrócenie mojej uwagi na tę konkretną postać.<?php $request = explode("/", substr(@$_SERVER['PATH_INFO'], 1)); $rest = 'rest_'.strtolower($_SERVER['REQUEST_METHOD']); if (function_exists($rest)) call_user_func($rest, $request); ?>
Wykrywanie metody HTTP lub tzw.
REQUEST METHOD
Może być wykonane przy użyciu następującego fragmentu kodu.Możesz to również zrobić za pomocą a,
switch
jeśli wolisz to odif-else
instrukcji.Jeśli w formularzu HTML wymagana jest metoda inna niż
GET
lubPOST
, często jest to rozwiązywane za pomocą ukrytego pola w formularzu.Aby uzyskać więcej informacji dotyczących metod HTTP, chciałbym odnieść się do następującego pytania StackOverflow:
PUT i DELETE protokołu HTTP oraz ich użycie w PHP
źródło
Możemy również użyć filtra_wejściowego do wykrycia metody żądania, zapewniając jednocześnie bezpieczeństwo poprzez kontrolę urządzeń wejściowych.
źródło
Ponieważ chodzi o REST, samo pobranie metody żądania z serwera nie wystarczy. Musisz także otrzymać parametry trasy RESTful. Powodem oddzielenia parametrów RESTful i GET / POST / PUT jest to, że zasób musi mieć swój własny unikalny adres URL do identyfikacji.
Oto jeden ze sposobów implementacji tras RESTful w PHP przy użyciu Slim:
https://github.com/codeguy/Slim
I odpowiednio skonfiguruj serwer.
Oto kolejny przykład użycia AltoRouter:
https://github.com/dannyvankooten/AltoRouter
źródło
Możesz użyć
getenv
funkcji i nie musisz pracować ze$_SERVER
zmienną:Więcej informacji:
http://php.net/manual/en/function.getenv.php
źródło
Przykład:
źródło
$_SERVER['REQUEST_METHOD']
, nawet dostosowana. Pamiętaj, że metoda jest tylko ciągiem w nagłówku żądania i naszym zadaniem jest sprawdzenie jej poprawności.W ten sposób możesz również osiągnąć w Zend Framework 2. Dzięki.
źródło
W podstawowym php możesz to zrobić w następujący sposób:
źródło
Warto dodatkowo zauważyć, że PHP zapełni wszystkie
$_GET
parametry, nawet jeśli wyślesz odpowiednie żądanie innego typu.Metody powyższych odpowiedzi są całkowicie poprawne, jednak jeśli chcesz dodatkowo odprawy dla
GET
parametrów podczas obsługiPOST
,DELETE
,PUT
itp wniosek, trzeba sprawdzić rozmiar$_GET
tablicy.źródło
Gdy zażądano metody, będzie miała ona
array
. Więc po prostu sprawdź za pomocącount()
.3v4l.org/U51TE
źródło
Użyłem tego kodu. To powinno działać.
Powyższy kod będzie działał z,
REST calls
a także będzie działałhtml form
źródło
Możesz uzyskać dowolne dane ciągu zapytania, tj
www.example.com?id=2&name=r
Musisz uzyskać dane za pomocą
$_GET['id']
lub$_REQUEST['id']
.Prześlij dane oznacza,
<form action='' method='POST'>
że musisz użyć formularza$_POST
lub$_REQUEST
.źródło