POST 본문을 php로 가져오려면 어떻게 해야 하나요?
POST로서 PHP 페이지에 이하의 내용을 송신합니다.
{a:1}
요청 본문(POST 요청)입니다.
php에서는 그 값을 추출하려면 어떻게 해야 합니까?
var_dump($_POST);
해결도 안 되고, 효과도 없어요.
POST 또는 PUT 요청의 엔티티 본문(또는 다른 HTTP 메서드)에 액세스하려면 다음 절차를 수행합니다.
$entityBody = file_get_contents('php://input');
또,STDIN
constant는 에 대해 이미 열려 있는 스트림입니다.php://input
대신 다음 작업을 수행할 수 있습니다.
$entityBody = stream_get_contents(STDIN);
I/Odocs 스트림에 대한 PHP 수동 항목에서 다음을 수행합니다.
php://input은 요청 본문에서 원시 데이터를 읽을 수 있는 읽기 전용 스트림입니다.POST 요청의 경우 php://input을 사용하는 것이 좋습니다.
$HTTP_RAW_POST_DATA
특별한 php.ini 디렉티브에 의존하지 않기 때문입니다.또한, 다음과 같은 경우$HTTP_RAW_POST_DATA
는 디폴트로는 입력되지 않습니다.이는 always_backet_raw_post_data를 활성화하는 대신 메모리 사용량이 적을 수 있습니다.php://input은 enctpe="formart/form-data"와 함께 사용할 수 없습니다.
구체적으로는, 다음의 점에 주의해 주세요.php://input
웹 SAPI에서 액세스하는 방법에 관계없이 스트림은 검색할 수 없습니다.이것은 한 번만 읽을 수 있다는 것을 의미합니다.대규모 HTTP 엔티티 본문이 정기적으로 업로드되는 환경에서 작업하는 경우 위의 첫 번째 예와 같이 입력을 버퍼링하지 않고 스트림 형태로 유지하는 것이 좋습니다.
다음과 같은 방법으로 스트림리소스를 유지 보수할 수 있습니다.
<?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
에서는 일정량의 데이터(기본값으로는 200만)가 저장되면 파일 시스템 스토리지로 투과적으로 전환되므로 메모리 소비를 관리할 수 있습니다.이 크기는 php.ini 파일 또는 추가 기능으로 조작할 수 있습니다./maxmemory:NN
,어디에NN
는, 일시 파일을 사용하기 전에 메모리에 보존하는 데이터의 최대량(바이트 단위)입니다.
물론 입력 스트림을 찾는 데 특별한 이유가 없는 한 웹 응용 프로그램에서 이 기능이 필요하지 않습니다.보통 HTTP 요청 엔티티 본문을 한 번 읽는 것으로 충분합니다. 앱이 무엇을 해야 할지 결정하는 동안 클라이언트를 하루 종일 기다리게 하지 마십시오.
php://input은 특정 요구에 사용할 수 없습니다.Content-Type: multipart/form-data
헤더 (enctype="multipart/form-data"
HTML 형식으로).이는 PHP가 이미 폼 데이터를 구문 분석하여$_POST
초글로벌의
배열 내의 반환값
$data = json_decode(file_get_contents('php://input'), true);
있는 수 .$_POST
이 '아니다'가 아닌 입니다.POST
"아니요" 입니다.POST
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★301
★★★★★★★★★★★★★★★★★」302
GET
!
★$_SERVER['REQUEST_METHOD']
확인하려고 합니다.
이 문제가 발생하지 않는 이유에 대해서는, https://stackoverflow.com/a/19422232/109787 를 참조해 주세요.
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());
은 php api를 입니다.file_get_contents("php://input")
에 사용되고 있습니다.javascript
를 사용합니다.ajax
XMLHttpRequest
.
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
console.log("done");
}
}
};
xhttp.open("POST", "http://127.0.0.1:8000/api.php", true);
xhttp.send(JSON.stringify({
username: $(this).val(),
email:email,
password:password
}));
$data = json_decode(file_get_contents("php://input"));
$username = $data->username;
$email = $data->email;
$password = $data->password;
변수를 확인합니다.
pecl/http 확장이 인스톨 되어 있는 경우는, 다음의 것도 사용할 수 있습니다.
$request = new http\Env\Request();
$request->getBody();
HTTP PECL 확장을 설치한 경우 함수를 사용하여 본문 데이터를 문자열로 가져올 수 있습니다.
http_get_request_body()
의 몸을 얻기 명시적으로 .PUT
★★★★★★★★★★★★★★★★★」POST
http://php.net/manual/fa/function.http-get-request-body.php에 기재되어 있습니다.
언급URL : https://stackoverflow.com/questions/8945879/how-to-get-body-of-a-post-in-php
'programing' 카테고리의 다른 글
날짜가 30일 이상인지 확인하다 (0) | 2022.10.02 |
---|---|
확인란 클릭 시 이벤트 버블링을 중지하는 방법 (0) | 2022.10.02 |
조건과 일치하는 배열 내 개체의 인덱스를 가져옵니다. (0) | 2022.10.02 |
Java에서의 Fail-safe 및 Fail-Fast Iterator란 무엇입니까? (0) | 2022.09.30 |
VueJ의 상태 저장 구성 요소 루트 요소에서 v-for를 사용할 수 없음s (0) | 2022.09.30 |