从HTTP请求订阅Observable

时间:2019-02-20 18:39:26

标签: angular spring spring-boot http

我的Spring Boot控制器发送字符串“ hello Angular”作为对http请求的简单响应。

@Controller
@RequestMapping(path = "/u")
public class UController {
    @RequestMapping("/greet")
        public  @ResponseBody  String greet() {
            System.out.println("you are in the method greet() ");
            return "hello Angular";
    }
}

我在控制台(System.out)上看到Angular请求了正确的方法,并且应该将响应发送给客户端。

我想通过Angular在网站上打印此消息,因此我从http客户端订阅了Observable,但是它没有出现在屏幕上。

这是我的Angular组件:

import { Component, OnInit } from '@angular/core';
import { HttpClientModule }    from '@angular/common/http';
import { HttpClient, HttpHeaders } from '@angular/common/http';

@Component({
  selector: 'app-root',
  template: `
    <div style="text-align:center">
      <h1> {{greeting}} </h1>
      </div>
    <router-outlet></router-outlet>
  `,
  styleUrls: ['./app.component.css']
})

export class AppComponent implements OnInit{

    greeting : string;

    constructor(private http: HttpClient){  }

    ngOnInit() {
        this.http.get<string>('http://localhost:8080/u/greet').subscribe(data => { this.greeting = data; });
    }
}

我真的不知道该如何解决。

1 个答案:

答案 0 :(得分:1)

发生错误是因为HttpClient假定内容是有效的JSON,而不是简单的字符串。它有效地尝试在内部解析JSON。如果您尝试执行JSON.parse("hello Angular"),它将显示完全相同的错误:

JSON.parse("hello Angular");

对于retrieve non-JSON content,您可以通过将响应类型指定为text并删除<string>的通用类型来执行以下操作:

this.http.get('http://localhost:8080/u/greet', {responseType: 'text'})
  .subscribe(data => { this.greeting = data; });

否则,对于从服务器返回的任何实际JSON(application/json)数据,您无需提供responseType,并且可以/应该使用通用类型化机制。

希望有帮助!