2016-03-01 21 views
27

Ho un regolatore di API Web che assomiglia a questo:angolare 2/Web Api - Errore JSON parsing errore di sintassi imprevisto fine dell'input

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

Questa è la sintassi corretta, ma quando provo a chiamare questo da un servizio in Angular 2, ricevo il messaggio di errore: "json sintattico errore sintassi errore inaspettato fine dell'input." Per risolvere questo problema, devo inserire un valore in ActionResult come

return Ok(1) 

Mi manca qualche configurazione? Il mio angolare chiamata di 2 servizio simile a questo:

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

Per un problema simile in HttpClient vedono questa discussione: https://github.com/angular/angular/issues/18680 –

risposta

38

Credo che quando si riceve una risposta vuota (senza carico) non è necessario chiamare il metodo json. Sotto il cofano, la risposta XHR non è definita, viene chiamato JSON.parse(undefined) e viene generato un errore.

Si potrebbe saltare la chiamata dell'operatore map:

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

Un altro modo:

Tutta la mia http.get, posta o mettere chiamata (per l'uniformità):

.map(this.extractData) 

In extractData (AGGIORNATO: grazie a feedback Raykrow, codice corto):

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

grazie per la condivisione! – ozOli

+0

soluzione fantastica @JeromeXoo, grazie –

+3

Ho usato questo concetto per risolvere lo stesso problema ma implementato come 'return res.text()? res.json(): {}; ' – raykrow

5

In senso stretto se l'API restituisce un codice OK senza contenuto, è necessario restituire 204 (nessun contenuto) - Angular sarebbe anche contento di ciò e non tenterà di analizzare nulla. Così il vostro metodo di controllo sarebbe diventato:

[HttpPost] 
public IHttpActionResult Test() 
{ 
    return NoContent(); 
} 
Problemi correlati