http_get_request_body

(PECL pecl_http >= 0.10.0)

http_get_request_bodyGet request body as string

Описание

string http_get_request_body ( void )

Get the raw request body (e.g. POST or PUT data).

This function can not be used after http_get_request_body_stream() if the request method was another than POST.

Список параметров

Возвращаемые значения

Returns the raw request body as string on success or NULL on failure.

Смотрите также

Коментарии

For those of you without the HTTP extension, try:
<?php
  $body 
= @file_get_contents('php://input');
?>
2007-08-23 14:01:18
http://php5.kiev.ua/manual/ru/function.http-get-request-body.html
Автор:
It seems that there is some weird behavior when using http_get_request_body() with fopen('php://input'). Specifically, reading the input with the fopen('php://input') routine before calling http_get_request_body() on a PUT HTTP request.

Here are some examples:

A POST request:
*********************************************************
PUT http://example.com/requestbodytest.php HTTP/1.1
Host: example.com
Keep-Alive: 300
Connection: keep-alive
Content-Type: text/xml
Content-Length: 58

<?xml version="1.0" encoding="utf-8" ?>
<body>test</body>
*********************************************************

with the following script:
*********************************************************
<?php
$body 
'';
$fh   = @fopen('php://input''r');
if (
$fh)
{
  while (!
feof($fh))
  {
   
$s fread($fh1024);
    if (
is_string($s))
    {
     
$body .= $s;
    }
  }
 
fclose($fh);
}
print(
"-------------- PHP Input Stream ----------------\n$body\n\n");

$body2 http_get_request_body();
print(
"---------- http_get_request_body() -------------\n$body2\n\n");

?>
*********************************************************

outputs this:
*********************************************************
-------------- PHP Input Stream ----------------
<?xml version="1.0" encoding="utf-8" ?>
<body>test</body>

---------- http_get_request_body() -------------
<?xml version="1.0" encoding="utf-8" ?>
<body>test</body>
*********************************************************

The same request to the same script using an HTTP PUT request, however, outputs this:
*********************************************************
-------------- PHP Input Stream ----------------
<?xml version="1.0" encoding="utf-8" ?>
<body>test</body>

---------- http_get_request_body() -------------
*********************************************************

It seems a valid workaround is to put a call to http_get_request_body() to cache the body content before an expected read to php://input (i.e. simply calling the function without manually storing the result caches the content for subsequent calls).
2010-05-27 20:03:05
http://php5.kiev.ua/manual/ru/function.http-get-request-body.html
In case this saves anyone else some frustration, the "Content-Length" header decides what will be returned for "php://input".  If you leave it out while testing, nothing will be returned for "php://input" or $HTTP_RAW_POST_DATA.

For example, if you are trying to test out a custom SOAP server app and you send a request like this without a Content-Length set:

-----
POST /soap_service.php HTTP/1.1
Authorization: Basic abcdefgh
User-Agent: SOAPy McSOAPclient
Host: example.com
Accept: */*
MIME-Version: 1.0
Content-type: text/xml; charset=utf-8

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cat="http://com.soapy/foobar"><soapenv:Header/><soapenv:Body><foo:ManageBar><foo:task id="1"><foo:getBar type="helloworld"/></foo:task></foo:ManageBar></soapenv:Body></soapenv:Envelope>
----

"php://input" will always return and empty string.
2013-05-31 23:31:32
http://php5.kiev.ua/manual/ru/function.http-get-request-body.html
@slave at codegrunt dot com
If you leave out Content-Length and have no Transfer-Encoding, your request is no longer valid.

RFC261 says at chapter 4.3:
"The presence of a message-body in a request is signaled by the inclusion of a Content-Length or Transfer-Encoding header field in the request's message-headers."

Without those headers, the server has no way of figuring out what the length of the body is. For a response, you could indicate it with a connection close, but obviously if you do that on a request you will never get a response!

So, I assume the PhP behaviour you describe is OK as you cannot expect it to auto-magically repair all sorts of broken requests!

@Tim Trinidad
Reading php://input or using http_get_request_body_stream() must be very similar.
The documentation says: 
"This function can not be used after http_get_request_body_stream() if the request method was another than POST."

So it looks very similar to what you describe. The documentation should then read:
"This function can not be used after http_get_request_body_stream() or reading php://input, if the request method was another than POST."
2013-06-25 01:11:36
http://php5.kiev.ua/manual/ru/function.http-get-request-body.html

    Поддержать сайт на родительском проекте КГБ