2016-08-07 24 views
21

Ich versuche, mit einem etwas RESTful API von einem Angular 2-Frontend zu sprechen.Body of Http.DELETE Anfrage in Angular2

Um ein Element aus einer Sammlung zu entfernen, muss ich zusätzlich zur eindeutigen ID (die an die URL angehängt werden kann) einige weitere Daten senden, nämlich ein Authentifizierungs-Token, einige Sammlungsinformationen und einige Zusatzdaten.

Der einfachste Weg, den ich gefunden habe, ist das Authentifizierungs-Token in die Anfrage Header und andere Daten im Körper zu setzen.

die Http-Modul von Angular 2 zu genehmigen ist jedoch nicht ganz von einer DELETE-Anforderung mit einem Körper und versucht, diese Anfrage

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 

gibt diesem Fehler

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

Jetzt zu machen, Mache ich etwas falsch in der Syntax? Ich bin mir ziemlich sicher, dass ein DELETE-Body per RFC unterstützt wird.

Gibt es bessere Möglichkeiten, diese Daten zu senden?

Oder sollte ich es einfach in den Headern ausgeben und es einen Tag nennen?

löschen (url, Optionen)

Die Anfrage:

Einsicht auf dieses Rätsel würde

+0

Verwendung POST und benennen Benennung findAndDelete von löschen Sinn zu machen. – YOU

+0

@YOU Ja, kann ich, aber sollte ich nicht versuchen, destruktive Aktionen von nicht-destruktiven Aktionen direkt auf Anfrage Typ Ebene zu halten? – TriTap

+0

dann müssen Sie es in Querystring setzen, aber normalerweise setzen Sie ID von dem, was Sie in URL löschen möchten, und Authentifizierungsträger in Ajax-Header, um Löschanforderung zu senden. – YOU

Antwort

5

Definition in http.js vom @ Winkel/http geschätzt werden akzeptiert keinen Körper, so scheint es, Ihre einzige Option ist, aber Ihre Daten in der URI.

fand ich ein anderes Thema mit Referenzen RFC, unter anderem entsprechen: How to pass data in the ajax DELETE request other than headers

+0

Gibt es ein offenes Problem auf GitHub für dieses Thema? Ich denke ein optionaler Body Parameter sollte unbedingt hinzugefügt werden. –

+6

Die zwei anderen Antworten beweisen diese Antwort falsch und es sollte nicht die akzeptierte Antwort sein. – Hampus

+0

Der angegebene Link für diese Antwort zeigt auf jquery ajax delete, nicht auf Angular 2, wie in der Frage angegeben. Dies sollte nicht die akzeptierte Antwort sein. –

46

Die http.delete (url, Optionen) einen Körper akzeptiert. Sie müssen es nur in das Optionsobjekt einfügen.

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

Referenzoptionen Schnittstelle: https://angular.io/docs/ts/latest/api/http/index/RequestOptions-class.html

+0

Danke, das ist genau das, was benötigt wird! – LJH

+0

Danke, das ist genau was benötigt wird! –

+0

Danke, das scheint genau das zu sein, was sie brauchten (ich auch, btw) –

8

Sie sind tatsächlich in der Lage Angular2 HTTP in täuschen ein body mit einem DELETE unter Verwendung der request Methode sendet. Dies ist, wie:

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

Hinweis, werden Sie die Request-Methode in den RequestOptionsArgs und nicht in http.request ‚s alternativem ersten Parameter Request setzen müssen. Das liefert aus irgendeinem Grund das gleiche Ergebnis wie die Verwendung http.delete

Ich hoffe, dass dies hilft und dass ich nicht zu spät bin. Ich denke, die eckigen Kerle sind hier falsch, um nicht zu erlauben, dass ein Körper mit gelöscht wird, obwohl es entmutigt ist.

+0

Ich realisiere zu spät, dass @ n4nd0_o das gleiche tut, aber immer noch mit der ursprünglichen Methode löschen. Ich werde diese Antwort für eine alternative Lösung irgendwie verlassen. – Hampus

+0

Ja @Hampus, wir bieten im Wesentlichen die gleiche Antwort. Deines ist ein bisschen "verbose", aber die gleiche Lösung: D –

1

Der REST nicht Körper Aufnahme mit DELETE Anfrage verhindern, aber es ist besser, Query-String zu verwenden, wie es die meisten genormte ist (es sei denn, die Daten müssen verschlüsselt werden)

Ich habe es mit Winkel 2 zu arbeiten indem Sie folgende:

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

Im folgenden finden Sie das entsprechende Codebeispiel für Angular 2/4/5 Projekte:

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

Beachten Sie, dass body durch RequestOptions geben wird