HTTP Post with no body in Angular
Asked Answered
M

6

43

I'm wondering how to send an HTTP post request without a body (specifically in Angular). Here's what I'm doing now, but I'm getting the error Expected 2-3 arguments, but got 1).

I realize the second argument is for the body, but I'm not sending that to the server (yes, I understand that a POST call changes the state of a system and have looked into THIS question).

postRequest(id) {
  this.http.post('/api?data=' + id).map(
    (response) => {
      return response;
    }
  )
}
Message answered 22/11, 2017 at 18:44 Comment(8)
Just send an empty objectPhial
very good answer @Antikhippe. you have to add a body even if it is empty , undefined etc.Izmir
No, that's actually not a good answer. Passing an empty object will not post a request without body. It will post a request with a body containing an empty JSON object ({}). Pass null.Runge
What are you trying to do with this Request though? What are you expecting in the backend from POSTing to this /api?data= route?Friseur
@Jota.Toledo Please see THIS question as mentioned in my original post.Message
My bad, oversaw that resource. Thanks for the heads up!Checkerberry
I had a similar problem and my issue was I didn't subscribe to the observable. The POST was meant as a command so nothing was returned. Still need to subscribe to get it to execute.Gillies
Use .subscribe(); Found the answer in #65078214Vizor
M
56

Looks like this is the appropriate answer:

postRequest(id) {
  this.http.post('/api?data=' + id, null).map(
    (response) => {
      return response;
    }
  )
}
Message answered 28/11, 2017 at 11:53 Comment(0)
S
6

If null is not working (4XX error client side), try with {} JSON:

postRequest(id) {
    this.http.post('/api?data=' + id, {}).map((response) => {return response;});
}
Saber answered 18/9, 2018 at 4:6 Comment(1)
null may not solve. I tried it and it does not solve. And, I think we need to send JSON anyhow. So, empty JSON file it isSaber
P
4

Go to definition of POST method using your IDE and you can see passing either body: any | null are the available inputs

post(url: string, body: any | null, options: {
    headers?: HttpHeaders | {
        [header: string]: string | string[];
    };
Preterition answered 11/8, 2020 at 12:58 Comment(0)
W
2

Try to call HTTP 'Post' without passing a 'body', and got this error in Angular 6 -

enter image description here

If we go to definition of POST method in client.d.ts, it shows that post method required either 'body' or 'null' value (e.g. - body: any | null)-

post(url: string, body: any | null, options?: {
...
}): Observable<Object>;

Solution - I just added 'null' and the error gone -

postSync(): any {
    return this.http.post(`${environment.apiUrl}/xyz/sync-api`, null);
}
Wieren answered 13/1, 2021 at 10:34 Comment(0)
S
1

Cannot comment the accepted answer, so I'll just add that passing null is not sufficient, because the content type will not be inferred correctly and you may receive a 415 (at least that was my case). Use the options on http.post to specify the content type in the header and force json with the null body

this.http.post<T>(url, null, {
 headers: {
    Accept: 'application/json',
    'Content-Type': 'application/json'
 }
});
Sourdough answered 28/4, 2023 at 14:3 Comment(0)
R
0

If request body is not there for post or put method then send empty object to request. ex: {}.

Romona answered 28/1, 2023 at 6:34 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.