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
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
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
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.
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);
}
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 }
});
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(...)
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é à traversRequestOptions
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);
}