Przesyłam jako POST na stronie php:
{a:1}
To jest treść żądania (żądanie POST).
W php, co muszę zrobić, aby wyodrębnić tę wartość?
var_dump($_POST);
nie jest rozwiązaniem, nie działa.
Przesyłam jako POST na stronie php:
{a:1}
To jest treść żądania (żądanie POST).
W php, co muszę zrobić, aby wyodrębnić tę wartość?
var_dump($_POST);
nie jest rozwiązaniem, nie działa.
Odpowiedzi:
Aby uzyskać dostęp do treści encji żądania POST lub PUT (lub dowolnej innej metody HTTP):
$entityBody = file_get_contents('php://input');
Ponadto STDIN
stała jest już otwartym strumieniem do php://input
, więc możesz alternatywnie:
$entityBody = stream_get_contents(STDIN);
Z ręcznego wpisu PHP w dokumentach strumieni we / wy :
Dane wejściowe php: // to strumień tylko do odczytu, który umożliwia odczytanie surowych danych z treści żądania. W przypadku żądań POST lepiej jest używać danych wejściowych php: // zamiast,
$HTTP_RAW_POST_DATA
ponieważ nie zależy to od specjalnych dyrektyw php.ini. Ponadto w przypadkach, w których$HTTP_RAW_POST_DATA
domyślnie nie jest zapełniany, jest to potencjalnie mniej obciążająca pamięć alternatywa dla aktywacji always_populate_raw_post_data. dane wejściowe php: // nie są dostępne z enctype = "multipart / form-data".
W szczególności należy zauważyć, że php://input
strumień, niezależnie od tego, w jaki sposób uzyskujesz do niego dostęp w internetowym SAPI, nie jest widoczny . Oznacza to, że można go odczytać tylko raz. Jeśli pracujesz w środowisku, w którym duże jednostki HTTP są rutynowo przesyłane, możesz chcieć zachować dane wejściowe w formie strumienia (zamiast buforować je jak w pierwszym przykładzie powyżej).
Aby zachować zasób strumienia, pomocne może być coś takiego:
<?php
function detectRequestBody() {
$rawInput = fopen('php://input', 'r');
$tempStream = fopen('php://temp', 'r+');
stream_copy_to_stream($rawInput, $tempStream);
rewind($tempStream);
return $tempStream;
}
php://temp
pozwala zarządzać zużyciem pamięci, ponieważ po przejściu pewnej ilości danych (domyślnie 2 MB) przełączy się na pamięć systemu plików. Rozmiarem tym można manipulować w pliku php.ini lub przez dołączenie /maxmemory:NN
, gdzie NN
jest maksymalna ilość danych przechowywanych w pamięci przed użyciem pliku tymczasowego, w bajtach.
Oczywiście, chyba że masz naprawdę dobry powód, aby szukać w strumieniu wejściowym, nie powinieneś potrzebować tej funkcji w aplikacji internetowej. Zwykle wystarczające jest przeczytanie treści jednostki żądania HTTP - nie zmuszaj klientów do czekania przez cały dzień, podczas gdy aplikacja wymyśli, co zrobić.
Zauważ, że wejście php: // nie jest dostępne dla żądań określających Content-Type: multipart/form-data
nagłówek ( enctype="multipart/form-data"
w formularzach HTML). Wynika to z parsowania przez PHP danych formularza na $_POST
superglobal.
php://input
jest to również puste dla typu application/x-www-form-urlencoded
zawartości (poza tym multipart/form-data
)
php://input
jest. Tak więc, gdy konfiguracje CGI (szybkie) stream_get_contents(STDIN)
nie będą działać, file_get_contents("php://input")
będą działać .
zwraca wartość w tablicy
$data = json_decode(file_get_contents('php://input'), true);
$data
tablicę asocjacyjną, aby sprawdzić, czy każda wartość jest zakodowana w pożądany sposób. Sposób patrzenia na „typ strumienia danych” może być uproszczony, ale może nie być tak skuteczny, jak radzenie sobie z kodowaniem w „formie strumienia” za pomocą filtra strumienia. Jeśli nie zajmujesz się problemami z kodowaniem, a jedynie odkażaniem i sprawdzaniem poprawności, brakuje Ci kroku.
Możliwym powodem pustego $_POST
jest to, że żądanie nie jest POST
lub POST
już nie jest ... Być może zaczęło się jako post, ale napotkało gdzieś 301
lub 302
przekierowało, na które zostało przełączone GET
!
Sprawdź, $_SERVER['REQUEST_METHOD']
czy tak jest.
Zobacz https://stackoverflow.com/a/19422232/109787, aby uzyskać dobre omówienie, dlaczego tak się nie stało, ale nadal tak jest.
POST
ale po sprawdzeniu okazała się, że była GET
. Po dodaniu /
na końcu mojego adresu URL zaczął on wyświetlać POST. Dziwne!
Sprawdź $HTTP_RAW_POST_DATA
zmienną
php://input
. $HTTP_RAW_POST_DATA
nie jest dostępny z enctype="multipart/form-data"
.
Jeśli masz zainstalowane rozszerzenie HTTP PECL, możesz skorzystać z http_get_request_body()
funkcji, aby uzyskać dane treści jako ciąg.
Jeśli masz zainstalowane rozszerzenie pecl / http , możesz również użyć tego:
$request = new http\Env\Request();
$request->getBody();
function getPost()
{
if(!empty($_POST))
{
// when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request
// NOTE: if this is the case and $_POST is empty, check the variables_order in php.ini! - it must contain the letter P
return $_POST;
}
// when using application/json as the HTTP Content-Type in the request
$post = json_decode(file_get_contents('php://input'), true);
if(json_last_error() == JSON_ERROR_NONE)
{
return $post;
}
return [];
}
print_r(getPost());
json_last_error() == JSON_ERROR_NONE
tak false
, to że pusta tablica powinna zostać zwrócona. Co jeśli ktoś przesłał XML lub YAML? Dodaj test dla Content-Type i stamtąd.
$_SERVER
superglobal, aby sprawdzić przydatne wartości.
http_get_request_body()
został wyraźnie wykonany w celu uzyskania treści PUT
i POST
wniosków zgodnie z dokumentacją http://php.net/manual/fa/function.http-get-request-body.php
$_POST
superglobal. Jest to również (szczególnie) prawdziwe w przypadku żądań PUT, ponieważ PHP nie ma odpowiadającego superglobala.