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 STDINstał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_DATAponieważ nie zależy to od specjalnych dyrektyw php.ini. Ponadto w przypadkach, w których$HTTP_RAW_POST_DATAdomyś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://inputstrumień, 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://temppozwala 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 NNjest 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-datanagłówek ( enctype="multipart/form-data"w formularzach HTML). Wynika to z parsowania przez PHP danych formularza na $_POSTsuperglobal.
php://inputjest to również puste dla typu application/x-www-form-urlencodedzawartości (poza tym multipart/form-data)
php://inputjest. 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);
$datatablicę 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 $_POSTjest to, że żądanie nie jest POSTlub POSTjuż nie jest ... Być może zaczęło się jako post, ale napotkało gdzieś 301lub 302przekierował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.
POSTale 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_DATAzmienną
php://input. $HTTP_RAW_POST_DATAnie 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_NONEtak 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.
$_SERVERsuperglobal, aby sprawdzić przydatne wartości.
http_get_request_body()został wyraźnie wykonany w celu uzyskania treści PUTi POSTwniosków zgodnie z dokumentacją http://php.net/manual/fa/function.http-get-request-body.php
$_POSTsuperglobal. Jest to również (szczególnie) prawdziwe w przypadku żądań PUT, ponieważ PHP nie ma odpowiadającego superglobala.