I have created a React application from which I am calling my server built on PHP.
The following is how I call my PHP file:
const requestOptions = {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: JSON.stringify({ name, username, password }),
};
console.log(requestOptions);
fetch('http://localhost/crud/requests/signup.php', requestOptions)
.then(res => res.json())
.then(data => console.log(data));
Here is what I have in the PHP file:
if (isset($_POST) && !empty($_POST)) {
// do something
}
When I print the $_POST
variable, I get an empty array. Even the $_RESPONSE
is empty.
But when I tried to print the input stream like this:
print_r(file_get_contents('php://input'));
Everything seems to be fine. Can anyone explain why does this happen? I tried to read it in the documentation & looked up on some forums and blogs but wasn't satisfied with the answers.
PHP’s built-in form support is only able to parse
application/x-www-form-urlencoded
forms andmultipart/form-data
forms. What you are actually sending is a JSON-serialized object, with the incorrect MIME type ofapplication/x-www-form-urlencoded
.To actually send an
application/x-www-form-urlencoded
form, useURLSearchParams
instead ofJSON.stringify
:There is no need to set
Content-Type
explicitly in this case: the browser will do that automatically. To send amultipart/form-data
payload (which you may need to do if you want to upload larger files), use aFormData
object instead.If you want to send JSON after all, you should send it with the correct MIME type in the header,
application/json
. On the PHP side, you will be resigned to parsing the payload manually usingjson_decode
.