2016-03-01 4 views
27

Ich habe einen Web-API-Controller, der wie folgt aussieht:Angular 2/Web Api - json Parsing-Fehler Syntaxfehler unerwartetes Ende des Eingangs

[HttpPost] 
    public IHttpActionResult Test() 
    { 
     return Ok(); 
    } 

Dies ist die korrekte Syntax, aber wenn ich versuche, das von einem nennen Service in Angular 2, bekomme ich die Fehlermeldung: "JSON Parsing Fehler Syntaxfehler unerwartetes Ende der Eingabe." Um dieses Problem zu beheben, muss ich einen Wert in das ActionResult eingeben, z. B.

return Ok(1) 

Fehle ich einige Konfiguration? Mein Angular 2 Service-Aufruf sieht wie folgt aus:

return this.http.post(API/Controller/Test).map(res => res.json()); 
+1

Für ein ähnliches Problem in Httpclient sehen diese Diskussion: https://github.com/angular/angular/issues/18680 –

Antwort

38

Ich denke, dass, wenn Sie eine leere Antwort (ohne Nutzlast) erhalten müssen Sie die json Methode nicht aufrufen. Unter der Haube ist die XHR-Antwort nicht definiert, JSON.parse(undefined) wird aufgerufen und ein Fehler wird ausgelöst.

Sie könnten den Ruf des map Betreiber überspringen:

return this.http.post(API/Controller/Test)/*.map(res => res.json())*/; 
40

Ein anderer Weg:

Alle meine http.get, Post oder Anruf setzen (für Einheitlichkeit):

.map(this.extractData) 

In extractData (AKTUALISIERT: Dank Raykrow-Feedback, Kurzcode):

private extractData(res: Response) {   
    return res.text() ? res.json() : {}; ; 
} 
+0

thanks for sharing! – ozOli

+0

geniale Lösung @JeromeXoo, danke –

+3

Ich habe dieses Konzept verwendet, um das gleiche Problem zu beheben, aber als 'return res.text() implementiert? res.json(): {}; ' – raykrow

5

Streng gesagt, wenn Ihre API einen OK-Code mit keinem Inhalt zurückgibt, sollten Sie 204 zurückgeben (kein Inhalt) - Angular würde auch damit zufrieden sein und nicht versuchen, irgendetwas zu parsen. So Ihre Controller-Methode würde:

[HttpPost] 
public IHttpActionResult Test() 
{ 
    return NoContent(); 
} 
Verwandte Themen