Angular2中Http.DELETE请求的正文

时间:2016-08-07 23:00:39

标签: angular rest http-delete

我正在尝试与Angular 2前端的某个RESTful API进行对话。

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

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

但是,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主体

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

或者我应该将其转储到标题中并将其称为一天?

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

13 个答案:

答案 0 :(得分:94)

http.delete(url,options)确实接受了一个正文。您只需将其放在选项对象中即可。

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);
  });

答案 1 :(得分:16)

您实际上可以使用Angular2 HTTP方法欺骗body发送DELETE request 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中设置请求方法。出于某种原因,这会产生与使用values

相同的结果

我希望这会有所帮助,而且我不会迟到。我认为有角度的人在这里是错误的,不允许身体通过删除,即使不鼓励。

答案 2 :(得分:10)

在Angular 5中,我不得不使用请求方法而不是删除来发送正文。 delete方法的文档不包含body,但它包含在请求方法中。

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 }
});

答案 3 :(得分:7)

下面是使用新HttpClient的Angular 4/5的相关代码示例。

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);
  }

答案 4 :(得分:5)

以下是Angular 6的示例

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);
        }

答案 5 :(得分:4)

如果您使用Angular 6,我们可以将主体放在http.request方法中。

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();
  }
}

答案 6 :(得分:3)

对于 angular 10,您还可以使用通用请求格式和 DELETE 方法:

http.request('DELETE',  path, {
            body:body,
            headers: httpHeaders,
            params: ((params != null) ? params : new HttpParams())
        })

答案 7 :(得分:1)

REST不会阻止使用DELETE请求包含正文,但最好使用查询字符串,因为它是最标准化的(除非您需要加密数据)

我通过以下方式让它与角度2一起工作:

{{1}}

答案 8 :(得分:1)

在Angular Http 7中,DELETE方法接受第二个参数options对象,在其中您将请求参数作为params对象与headers对象一起提供。这与Angular6不同。

查看示例:

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

答案 9 :(得分:0)

以下是Angular 2/4/5项目的相关代码示例:

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

传递

答案 10 :(得分:0)

deleteInsurance(insuranceId: any) {
    const insuranceData = {
      id : insuranceId
    }
    var reqHeader = new HttpHeaders({
            "Content-Type": "application/json",
        });
        const httpOptions = {
            headers: reqHeader,
            body: insuranceData,
        };
    return this.http.delete<any>(this.url + "users/insurance", httpOptions);
    }

答案 11 :(得分:0)

由于弃用了 RequestOptions ,因此不支持将数据作为正文发送到DELETE请求中。

如果您查看 DELETE 的定义,它看起来像这样:

    delete<T>(url: string, options?: {
      headers?: HttpHeaders | {
         [header: string]: string | string[];
        };
      observe?: 'body';
      params?: HttpParams | {
          [param: string]: string | string[];
         };
      reportProgress?: boolean;
      responseType?: 'json';
      withCredentials?: boolean;
     }): Observable<T>;

您可以在 options 对象的 params 中将有效载荷与DELETE请求一起发送,如下所示:

this.http.delete('http://testAPI:3000/stuff', { params: {
    data: yourData
     }).subscribe((data)=>. 
        {console.log(data)});

但是,请注意,参数仅接受 string string [] 的数据,因此除非将其字符串化,否则您将无法发送自己的接口数据。

答案 12 :(得分:-1)

来自 @ angular / http 的http.js中的定义:

  

删除(网址,选项)

请求不接受正文,所以看起来您唯一的选择就是在URI中使用您的数据。

我找到了另一个主题,其中包含对应RFC的引用,以及其他内容: How to pass data in the ajax DELETE request other than headers