Corps de Http.Supprimer la demande dans Angular2

j'essaie de parler à une API un peu reposante à partir d'un front angulaire 2.

pour supprimer un élément d'une collection, je dois envoyer quelques autres données en plus de l'id unique supprimé(qui peut être ajouté à l'url), à savoir un token d'authentification, quelques informations de collecte et quelques données auxiliaires.

le moyen le plus simple que j'ai trouvé pour le faire est de mettre le jeton d'authentification dans les en-têtes de requête, et d'autres données dans le corps.

cependant, le module Http D'Angular 2 n'approuve pas tout à fait une requête de suppression avec un corps, et essaie 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.

maintenant, est-ce que je fais quelque chose de mal sur le plan de la syntaxe? Je suis presque sûr qu'un corps de suppression est pris en charge par RFC

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

ou devrais-je le jeter dans les en-têtes et l'appeler un jour?

toute idée sur cette énigme serait appréciée

27
demandé sur student 2016-08-08 02:00:38

8 réponses

définition dans http.js du @angular / http :

supprimer (url, options)

la requête n'accepte pas un corps donc il semble que votre seule option soit de ne pas utiliser vos données dans L'URI.

j'ai trouvé un autre sujet avec des références pour correspondre RFC, entre autres choses: Comment passer des données en ajax SUPPRIMER la demande autres que les en-têtes

2
répondu AndreasV 2017-05-23 11:47:08

Le http.supprimer(url, options) accepte un corps. Vous avez juste besoin de le mettre 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

65
répondu n4nd0_o 2018-08-30 01:15:02

vous êtes en fait capable de tromper Angular2 HTTP dans l'envoi d'un body avec un DELETE en utilisant la méthode request . 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)});

Note, vous devrez définir la méthode de requête dans le RequestOptionsArgs et non dans le premier paramètre Request de http.request . Que pour une raison quelconque donne le même résultat que l'utilisation http.delete

j'espère que cela aide et que je ne suis pas trop en retard. Je pense que l'angle de les gars ont tort ici de ne pas permettre à un corps d'être passé avec Supprimer, même si elle est découragée.

15
répondu Hampus 2016-12-02 10:14:39

ci-dessous est un exemple de code pertinent pour L'angle 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);
  }
5
répondu Garrett Sanderson 2018-03-20 18:57:17

en angle 5, j'ai dû utiliser la méthode request au lieu de delete pour envoyer un corps. La documentation pour la méthode delete ne comprend pas body, mais elle est incluse 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 }
});
4
répondu Jeff Cross 2018-03-28 14:44:35

le reste n'empêche pas L'inclusion du corps avec la requête DELETE mais il est préférable d'utiliser la chaîne de requête car elle est la plus standardisée (sauf si vous avez besoin que les données soient cryptées)

j'ai obtenu de travailler avec angular 2 en faisant ce qui suit:

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(...)
1
répondu mbryja 2017-08-22 19:52:15

ci-dessous est l'exemple de code pertinent pour les projets angulaires 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;
  });

Avis body est passé à travers RequestOptions

0
répondu student 2017-12-22 10:24:05

ci-dessous est un exemple pour L'angle 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);
        }
0
répondu unknow27 2018-08-21 11:12:28