2017-10-10 5 views
3

Je tente d'obtenir des données à partir d'un service à l'aide de la requête POST. Mais je ne peux pas changer les en-têtes (TS ne compile pas) ou le type de contenu. Je reçois cette erreur console:Type de contenu de requête HTTP angulaire de 'text/plain' à 'application/json'

état ": 415," erreur ":" Type de support non pris en charge " "exception": "org.springframework.web.HttpMediaTypeNotSupportedException", "message":" Type de contenu ' text/plain' non supporté »

est mon code ci-dessous composant

import { Component, OnInit } from '@angular/core'; 
 
import { Http, Headers, Response, URLSearchParams } from '@angular/http'; 
 
import { HttpClient } from '@angular/common/http'; 
 
import 'rxjs/add/operator/map'; 
 

 
@Component({ 
 
    selector: 'app-search', 
 
    templateUrl: './search.component.html', 
 
    styleUrls: ['./search.component.css'] 
 
}) 
 
export class SearchComponent implements OnInit { 
 

 
    searchValue: any = ''; 
 

 
    constructor(private http: HttpClient) { } 
 

 
    getData() { 
 

 
    this.http.post('MY URL', 
 
    JSON.stringify({ 
 
     "q": "Achmea" 
 
    })) 
 
    .subscribe(
 
    data => { 
 
     alert('ok'); 
 
     console.log(data); 
 
    } 
 
    )

NB:. Utilisé t L'extrait de code parce que le formatage ne me laisserait pas poster comme pré.

Utilisation de la dernière version angulaire 4. Le serveur doit également être correctement configuré, n'acceptant que les données json. J'ai essayé les exemples de documents Angular mais aucun d'eux n'a fonctionné.

Quelqu'un at-il une idée de comment le faire fonctionner? Merci d'avance.

Répondre

0

Utiliser les en-têtes:

var headers = new Headers({ 
    "Content-Type": "application/json", 
    "Accept": "application/json" 
}); 

this.http.post(this.oauthUrl, JSON.stringify(postData), { 
    headers: headers 
}) 
+0

'[ts] Argument de type '{en-têtes: en-têtes; } 'n'est pas assignable au paramètre de type' {headers ?: HttpHeaders; observer ?: "corps"; params ?: HttpParams; reportProgress?: boolean; respons ... '. Les types d'en-têtes de propriété sont incompatibles. Le type 'En-têtes' n'est pas assignable pour taper 'HttpHeaders'. La propriété 'headers' est manquante dans le type 'Headers''. Voici ce que mon code studio visuel indique sur la ligne d'en-tête et ne compile pas. – raulicious

+0

Vérifiez si vous ajoutez ceci à votre importation: 'import {Http, En-têtes, Response, RequestOptions, ResponseContentType} à partir de '@ angular/http';' –

+0

Non, cela ne fonctionne pas non plus. Je les ai aussi importés aussi ... Chaque réponse que je vois sur stackoverflow liée à ceci se décompose sur moi dans la partie headers. – raulicious

1

En tant que meilleure approche, vous pouvez créer un fichier appelé http-config.ts et insérez le code ci-dessous

import {Headers} from '@angular/http'; 

export const contentHeaders = new Headers(); 
contentHeaders.append('Accept', 'application/json'); 
contentHeaders.append('Content-Type', 'application/json'); 

puis dans votre classe de service

import {Http, RequestOptions, Headers, Response} from "@angular/http"; 
@Injectable() 
export class MyService { 
url:string = '<paste your url here>' 
getData(id: string): Observable<any> { 
    let options = new RequestOptions({headers: contentHeaders}); 
    return this.http 
    .get(this.url, options) 
    .map(this.extractData) 
    .catch(this.handleError);} 
} 

dans votre composant

constructor(private myService: MyService){} 

    private subscription: Subscription; 
    getData(popId: string) { 
    this.subscription = this.myService.getData() 
    .subscribe(
    (data: any) => { 
     console.log(data); 
    }, 
    error => { 
     console.log(error); 
    }); 
    } 

espérons que cela aide.

+0

cela ne fonctionne pas non plus. cette partie sur le service est totalement soulignée dans vsc. 'retour this.http .get (this.url, options) .map (this.extractData) .catch (this.handleError)' et aussi quand this.myService à la page composante – raulicious

+0

En fait, vous devez injectez votre service dans votre composant. J'ai mis à jour ma réponse. si vous avez toujours une erreur, veuillez la poster ici – VithuBati

+0

J'ai eu une erreur dans vsc qui n'a pas laissé le code compiler dans cette partie du composant: 'this.myService.getData()' Im très nouveau à angulaire et je ne suis pas sûr même où mettre mon URL dans ce cas. Je voudrais vraiment juste un moyen très simple de faire fonctionner cela. – raulicious

2

Dans votre exemple (et aussi dans les commentaires) les deux différentes implémentations http fournies par angular sont mélangées. Puisque angulaire 4 HttpClient de '@ angular/common/http' est disponible et est la voie recommandée à suivre. Depuis angulaire 5 l'ancien Http de '@ angular/http' est même marqué comme obsolète.

Afin d'éviter le message d'exception de votre base, vous devez définir vos en-têtes de la manière suivante:

const headers = new HttpHeaders().set('Content-Type', 'application/json; charset=utf-8'); 
return this.httpClient.post<T>(this.httpUtilService.prepareUrlForRequest(url), body, {headers: headers}) 
... 

S'il vous plaît supprimer toutes les dépendances de « @ angulaire/http » dans votre code. Tant que vous utilisez des objets de ce module, vous aurez des problèmes avec votre code.