Angular http post请求内容类型从'text / plain'到'application / json'

时间:2017-10-10 14:44:10

标签: angular http post request

我试图使用POST请求从服务获取数据。但我不能改变标题(TS不会编译)或内容类型。我在控制台中收到此错误:

  

status“:415,”error“:”Unsupported Media Type“,”exception“:”org.springframework.web.HttpMediaTypeNotSupportedException“,”message“:”内容类型'text / plain'不受支持“

以下是我的组件代码。

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

注意:使用了代码段,因为格式化不允许我作为预先发布。

使用最新的角度4版本。 还应正确配置服务器,仅接受json数据。 我尝试了Angular文档中的示例,但没有一个能够工作。

任何人都知道如何让它运作? 提前谢谢。

6 个答案:

答案 0 :(得分:5)

在您的示例中(以及在注释中),由angular提供的两个不同的http实现被混淆。由于'@ angular / common / http'的角度4 HttpClient可用,因此是推荐的方法。由于角度为5,来自'@ angular / http'的旧Http甚至被标记为已弃用。

为了防止后端出现异常消息,您必须按以下方式设置标题:

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

请在代码中删除“@ angular / http”中的所有依赖项。只要您使用此模块中的对象,您的代码就会出现问题。

答案 1 :(得分:2)

作为最佳方法,您可以创建一个名为http-config.ts的文件,并在代码

下面插入
import {Headers} from '@angular/http';

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

然后在您的服务类

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);}
 }
您组件中的

   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);
    });
  }
希望有所帮助。

答案 2 :(得分:0)

使用标题:

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

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

答案 3 :(得分:0)

我通过httpClient和以下代码使用它:

const postUrl = this.config.baseUrl + '/Save/' + username;
    const headers = new HttpHeaders();
    headers.append('Content-Type', 'application/json');
    headers.append('Accept', 'application/json');
    return this.http.post<string>(postUrl, '', {headers: headers});

答案 4 :(得分:0)

我遇到了类似的问题,并且能够使用HttpInterceptor解决该问题。以下示例应查找内容类型为“文本/纯文本”的所有Http请求,并将类型转换为“ application / json”,以及转换正文json。任何其他内容类型都应该保留。

import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpHandler, HttpRequest, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable()
export class ContentTypeInterceptor implements HttpInterceptor {

  public constructor() {}

  intercept(
    req: HttpRequest<any>,
    next: HttpHandler
  ): Observable<HttpEvent<any>> {
    const ct = req.detectContentTypeHeader();
    return ct != null && ct.startsWith('text/plain')
        ? next.handle(req.clone({
                setHeaders: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(req.body)
            }))
        : next.handle(req);
  }
}

顺便说一句,在我的实际实现中,我使用了一个白名单(即api),因此我不会意外地修改了我不希望的请求!

答案 5 :(得分:0)

const httpOptions = {
  headers: new HttpHeaders({
    'Content-Type': 'application/json'
  })
}

这项工作是有角度的