I have a remote server and a local client which sends a simple post request with one header Content-Type: application/json and with the body '{"text": "hello"}'.
The server code is here. It prints the request body and the header.
import * as express from 'express';
import * as bodyParser from "body-parser";
const app = express();
const router = express.Router();
router.route("/home")
.all(bodyParser.json())
.all(function (req, res, next) {
console.log(req.body, req.headers['content-type']); // !!! print to console body and header
next();
})
.post( (req, res, next) => {
res.status(200).json({
message: req.body,
})
}
);
app.use((req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
res.header("Access-Control-Allow-Methods", "GET, PATCH, PUT, POST, DELETE, OPTIONS");
next();
});
app.use('/api/v1', router);
app.listen(3000, function(){
console.log('listening on 3000');
});
The post request works fine from Postman and from curl.
curl --location --request POST 'http://vm-gudiea.sio.lab.emc.com:3000/api/v1/home' --header 'Content-Type: application/json' --data-raw '{"text": "hello"}'
For both requests the server prints the following body and content-type header.
{ text: 'hello' } 'application/json'
But I need to send the request from my Angular app. I have the following method in a service there
sendInitialRequest(): void {
const myHeaders = new HttpHeaders().set('Content-Type', 'application/json');
this.http.post(this.remoteUrl, JSON.stringify({text: 'hello'}), {headers: myHeaders})
.subscribe(data => console.log(data));
}
But if I call the method remote server will print the output
{} undefined
So it didn’t get a Content-Type header and body for some reason. Where is the bug here? How can I send a post request with body and header from an Angular app ?
Advertisement
Answer
if it is related to cors, install this package in you API https://www.npmjs.com/package/cors
then use it as following
import * as cors from 'cors';
...
app.options('*', cors());
app.use(cors());
other tipps:
do not stringify your JSON in the angular request. also there is not need to explicitly set the json header, angular will take care of that for you.
this.http.post(this.remoteUrl, {text: 'hello'})
.subscribe(data => console.log(data));