66

Our project is migrating to Angular4, and use @angular/common/http Httpclient as the default network tool. But I found there are no body params in delete function. How do I add the body to delete function? Thanks.

8
  • 6
    Possible duplicate of Body of Http.DELETE request in Angular2 Commented Sep 5, 2017 at 7:23
  • 1
    he is asking about the new HttpClient not the old http module Commented Sep 5, 2017 at 7:24
  • but the implementation which he is seeking remains same for both the cases, try going through the link shared. Commented Sep 5, 2017 at 7:25
  • Take a look at this: angular.io/api/http/RequestOptions Commented Sep 5, 2017 at 7:26
  • 1
    for future readers - since Angular 4.3 (this includes Angular 5+) they removed the body from the delete method of angular HttpClient the alternative is to use http.request() like Andrii Ivanyk posted below. it was removed because the specification for Delete is unclear regarding the use of BODY in it. Commented Feb 8, 2018 at 11:47

3 Answers 3

124

You may use a universal request method on the HttpClient class instead. This method has the body in options. https://angular.io/api/common/http/HttpClient#members

e.g this.http.request('delete', 'url', { body: ... })

Sign up to request clarification or add additional context in comments.

4 Comments

@StefanFalk probably because the "proper" way to delete stuff in a RESTful way is to have a unique URL for each unique resource (e.g.: /clients/<id>). But real life APIs are seldom RESTful, unfortunately.
@JosephTinoco No I just mean the call itself. There could easily be a this.http.delete() method that wraps this s.t. the interface gets more intuitive.
@StefanFalk That's kinda my point. The "intuitive" interfaces are all RESTful, everything else is possible but only with the ugly/less intuitive this.http.request() method. It's like Angular is saying "if you want nice, readable code, you gotta go RESTful in the backend".
In Angular 9+ you will need to this.http.request('DELETE', 'url', { body: ... }). In my case the uppercase method string was necessary.
36
const httpOptions = {
    headers: new HttpHeaders({ 'Content-Type': 'application/json' }), body: your body data
};


return new Promise(resolve => {
    this.httpClient.delete(URL, httpOptions)       
                   .subscribe(res => {     
                       resolve(res);
                   }, err => {               
                       resolve(err);
                   });
    });

by using httpOptions, you can set header and body in it. please refer this https://angular.io/tutorial/toh-pt6#delete-a-hero

1 Comment

Not sure what version of Angular you're using, but this doesn't work in Angular 5 using the HttpClient. The typings file indicates body doesn't exist. You need to use this.http.request - stackoverflow.com/a/46316857/1148107
2

I also get this problem and my solution is creating a new HttpRequest of delete method, then clone this request, reset its body with your data.

let req = new HttpRequest('DELETE', 'url');
let newReq = req.clone({body: [10]});
this.http.request(newReq).subscribe((res) => {
    console.log(res);
}, (err) => {
    console.log(err);
});

The clone() is required, because the body still can not be directly set in the new HttpRequest().

1 Comment

Indeed, creating an HttpRequest with method "delete" and passing directly the body in the constructor does not work. However, it works fine with method "post"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.