The example in this article describes the method of obtaining the original text of HTTP request in PHP. The specific steps are as follows:
1. Get the request line: Method, URI, protocol
can be obtained from the super variable $_SERVER. The values of the three variables are as follows:
$_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']."\r\n";
2. Get all Headers
PHP has a built-in function getallheader(), which is an alias of the apache_request_headers() function, which can return all the headers of the HTTP request in the form of an array. But this function can only work under Apache. If you change to Nginx or the command line, an error that the function does not exist will be reported directly.
A more general method is to extract it from the super variable $_SERVER. The key values of the Header all start with "HTTP_". You can obtain all the Headers based on this feature.
The specific code is as follows:
function get_all_headers() { $headers = array(); foreach($_SERVER as $key => $value) { if(substr($key, 0, 5) === 'HTTP_') { $key = substr($key, 5); $key = strtolower($key); $key = str_replace('_', ' ', $key); $key = ucwords($key); $key = str_replace(' ', '-', $key); $headers[$key] = $value; } } return $headers; }
3. Obtain Body
Officially provides a method to obtain the request body, namely:
file_get_contents('php://input')
4. The final complete code is as follows:
/** * 获取HTTP请求原文 * @return string */ function get_http_raw() { $raw = ''; // (1) 请求行 $raw .= $_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']."\r\n"; // (2) 请求Headers foreach($_SERVER as $key => $value) { if(substr($key, 0, 5) === 'HTTP_') { $key = substr($key, 5); $key = str_replace('_', '-', $key); $raw .= $key.': '.$value."\r\n"; } } // (3) 空行 $raw .= "\r\n"; // (4) 请求Body $raw .= file_get_contents('php://input'); return $raw; }
Interested readers can debug the examples described in this article to deepen their understanding. I believe it will be helpful to everyone's PHP programming.