Angular2中Http.DELETE请求的正文

问题描述 投票:50回答:10

我正在尝试从Angular 2前端与某种RESTful API进行通信。

要从集合中删除某些项目,除了可移动的唯一ID(可以附加到url)之外,我还需要发送其他一些数据,即身份验证令牌,一些集合信息和一些辅助数据。

我发现这样做的最直接的方法是将身份验证令牌放入请求标头中,并将其他数据放入正文中。

但是,Angular 2的Http模块不太赞成带有主体的DELETE请求,并尝试发出此请求

let headers= new Headers();
headers.append('access-token', token);

let body= JSON.stringify({
    target: targetId,
    subset: "fruits",
    reason: "rotten"
});

let options= new RequestOptions({headers:headers});
this.http.delete('http://testAPI:3000/stuff', body,options).subscribe((ok)=>{console.log(ok)}); <------line 67

给出此错误

app/services/test.service.ts(67,4): error TS2346: Supplied parameters do not match any signature of call target.

现在,我在语法上做错了吗?我很确定每个RFC支持DELETE正文

是否有更好的方法发送该数据?

还是我应该只将其转储到标题中并每天调用?

对此难题的任何见解都将受到赞赏

angular rest http-delete
10个回答
-2
投票
@ angular / http中的http.js中的定义:]

删除(URL,选项)

该请求不接受正文,因此似乎唯一的选择是但您的数据在URI中。

我发现了另一个主题,该主题带有与RFC对应的引用:How to pass data in the ajax DELETE request other than headers


0
投票
查看示例:

this.httpClient.delete('https://api-url', { headers: {}, params: { 'param1': paramValue1, 'param2': paramValue2 } });


120
投票
http.delete('/api/something', new RequestOptions({ headers: headers, body: anyObject }))

参考选项界面:https://angular.io/api/http/RequestOptions

更新:

以上代码段仅适用于Angular 2.x,4.x和5.x。

对于版本6.x和7.x,Angular根据您的需要提供了不同的重载。在此处检查所有重载:https://angular.io/api/common/http/HttpClient#delete

const options = { headers: new HttpHeaders({ 'Content-Type': 'application/json', }), body: { id: 1, name: 'test', }, }; this.httpClient .delete('http://localhost:8080/something', options) .subscribe((s) => { console.log(s); });


16
投票
let body = { target: targetId, subset: "fruits", reason: "rotten" }; let options = new RequestOptionsArgs({ body: body, method: RequestMethod.Delete }); this.http.request('http://testAPI:3000/stuff', options) .subscribe((ok)=>{console.log(ok)});

注意,您必须在RequestOptionsArgs中设置请求方法,而不是在http.request的替代第一参数Request中设置。由于某种原因产生的结果与使用http.delete

的结果相同
我希望这会有所帮助,并且我不迟到。我认为,有角度的人在这里是错误的,即使不鼓励删除,也不允许传递它。

12
投票
import { HttpClient } from '@angular/common/http'; import { HttpHeaders } from '@angular/common/http'; this.http.request('DELETE', url, { headers: new HttpHeaders({ 'Content-Type': 'application/json', }), body: { foo: bar } });

8
投票
Reference from github

您可以尝试一下,对我来说它有用。

import { HttpClient } from '@angular/common/http'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.scss'], }) export class AppComponent { constructor( private http: HttpClient ) { http.request('delete', url, {body: body}).subscribe(); } }


7
投票
import { HttpClient } from '@angular/common/http'; import { HttpHeaders } from '@angular/common/http'; public removeItem(item) { let options = { headers: new HttpHeaders({ 'Content-Type': 'application/json', }), body: item, }; return this._http .delete('/api/menu-items', options) .map((response: Response) => response) .toPromise() .catch(this.handleError); }

5
投票
deleteAccount(email) { const header: HttpHeaders = new HttpHeaders() .append('Content-Type', 'application/json; charset=UTF-8') .append('Authorization', 'Bearer ' + sessionStorage.getItem('accessToken')); const httpOptions = { headers: header, body: { Email: email } }; return this.http.delete<any>(AppSettings.API_ENDPOINT + '/api/Account/DeleteAccount', httpOptions); }

1
投票
通过执行以下操作,我使其可以与角度2一起使用:

let options:any = {} option.header = new Headers({ 'header_name':'value' }); options.search = new URLSearchParams(); options.search.set("query_string_key", "query_string_value"); this.http.delete("/your/url", options).subscribe(...)


0
投票
let headers = new Headers({ 'Content-Type': 'application/json' }); let options = new RequestOptions({ headers: headers, body: { id: 123 } }); return this.http.delete("http//delete.example.com/delete", options) .map((response: Response) => { return response.json() }) .catch(err => { return err; });

注意body通过RequestOptions
© www.soinside.com 2019 - 2024. All rights reserved.