85 votes

Corps de la requête Http.DELETE en Angular2

J'essaie de parler à une API un peu RESTful à partir d'un frontal Angular 2.

Pour retirer un élément d'une collection, j'ai besoin d'envoyer d'autres données en plus de l'identifiant unique retiré (qui peut être ajouté à l'url), à savoir un jeton d'authentification, des informations sur la collection et des données auxiliaires.

La méthode la plus simple que j'ai trouvée consiste à placer le jeton d'authentification dans les en-têtes de la demande, et les autres données dans le corps de la demande.

Cependant, le module Http d'Angular 2 n'approuve pas vraiment une requête DELETE avec un corps, et en essayant de faire cette requête

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

donne cette erreur

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

Est-ce que je fais quelque chose de mal au niveau de la syntaxe ? Je suis presque sûr qu'un corps DELETE est pris en charge par la RFC.

Y a-t-il de meilleures façons d'envoyer ces données ?

Ou est-ce que je dois juste le mettre dans les en-têtes et l'appeler un jour ?

Nous vous remercions de bien vouloir nous éclairer sur cette énigme.

1 votes

Utiliser POST et renommer le libellé de delete en findAndDelete pour donner du sens.

0 votes

@YOU Oui, je peux, mais ne devrais-je pas essayer de distinguer les actions destructives des actions non destructives au niveau du type de demande ?

0 votes

Alors vous devrez le mettre dans la querystring, mais normalement vous mettez l'id de ce que vous voulez supprimer dans l'url, et le porteur d'authentification dans le header ajax pour envoyer la demande de suppression.

199voto

n4nd0_o Points 1039

Le site http.delete(url, options) accepte un corps. Il suffit de le placer dans l'objet options.

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

Interface des options de référence : https://angular.io/api/http/RequestOptions

UPDATE :

L'extrait ci-dessus ne fonctionne que pour Angular 2.x, 4.x et 5.x.

À partir de la version 6.x, Angular propose 15 surcharges différentes. Consultez toutes les surcharges ici : https://angular.io/api/common/http/HttpClient#delete

Exemple d'utilisation :

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

26 votes

RequestOptions est obsolète.

0 votes

Impossible de trouver le nom 'RequestOptions'. J'obtiens cette erreur dans angular 10

0 votes

@SachiniWitharana, si vous le relisez, la RequestOptions a été déprécié depuis un certain temps. Depuis la v6, le httpClient fournit différentes surcharges au lieu d'une interface.

21voto

Jeff Cross Points 81

Dans Angular 5, j'ai dû utiliser la méthode request au lieu de delete pour envoyer un corps. La documentation de la méthode delete n'inclut pas le corps, mais il est inclus dans la méthode request.

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

0 votes

Si j'essaie cette méthode, la méthode de demande contient OPTIONS au lieu de DELETE. Êtes-vous sûr que cela fonctionne toujours ?

0 votes

@Jochen Je suis presque sûr que cela fonctionne pour moi et envoie une requête DELETE dans Angular 5.

0 votes

Le problème a été trouvé, c'est le serveur qui n'a pas répondu avec les bonnes OPTIONS et donc un DELETE n'a jamais été envoyé par le client à cause de cela.

18voto

Hampus Points 106

Vous êtes en fait capable de tromper Angular2 HTTP en envoyant un body avec un DELETE en utilisant le request méthode. Voici comment :

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

Notez que vous devrez définir la méthode de requête dans le champ RequestOptionsArgs et non dans http.request Le premier paramètre alternatif de l Request . Pour une raison quelconque, cela donne le même résultat qu'en utilisant http.delete

J'espère que cela vous aidera et que je ne suis pas trop en retard. Je pense que les gars d'Angular ont tort de ne pas permettre qu'un corps soit passé avec delete, même si c'est déconseillé.

0 votes

Je réalise trop tard que celui de @n4nd0_o fait la même chose mais en utilisant la méthode de suppression originale. Je vais quand même laisser cette réponse pour une solution alternative.

0 votes

Oui @Hampus, nous fournissons essentiellement la même réponse. La vôtre est un peu plus "verbeuse", mais la solution reste la même :D

12voto

Garrett Sanderson Points 330

Vous trouverez ci-dessous un exemple de code pertinent pour Angular 4/5 avec le nouveau HttpClient.

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

-11voto

AndreasV Points 200

Définition dans le fichier http.js de la section @angular/http :

delete(url, options)

La requête n'accepte pas de corps, il semble donc que votre seule option soit de placer vos données dans l'URI.

J'ai trouvé un autre sujet avec des références à la RFC correspondante, entre autres choses : Comment transmettre des données autres que des en-têtes dans la demande DELETE d'ajax ?

1 votes

Y a-t-il un problème ouvert sur github pour ce sujet ? Je pense qu'un paramètre de corps optionnel devrait être ajouté.

32 votes

Les deux autres réponses prouvent que cette réponse est fausse et qu'elle ne devrait pas être la réponse acceptée.

1 votes

Le lien fourni pour cette réponse pointe vers jquery ajax delete, et non Angular 2 comme spécifié dans la question. Cette réponse ne devrait pas être acceptée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X