programing

POST 본문을 php로 가져오려면 어떻게 해야 하나요?

yoursource 2022. 10. 2. 12:16
반응형

POST 본문을 php로 가져오려면 어떻게 해야 하나요?

POST로서 PHP 페이지에 이하의 내용을 송신합니다.

{a:1}

요청 본문(POST 요청)입니다.
php에서는 그 값을 추출하려면 어떻게 해야 합니까?

var_dump($_POST); 

해결도 안 되고, 효과도 없어요.

POST 또는 PUT 요청의 엔티티 본문(또는 다른 HTTP 메서드)에 액세스하려면 다음 절차를 수행합니다.

$entityBody = file_get_contents('php://input');

또,STDINconstant는 에 대해 이미 열려 있는 스트림입니다.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 ★★★★★★★★★★★★★★★★★」302GET!

$_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를 사용합니다.ajaxXMLHttpRequest.

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 ★★★★★★★★★★★★★★★★★」POSThttp://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

반응형