订阅Angular 6 POST请求

时间:2018-06-28 19:12:53

标签: spring-boot angular6

场景

我有一个与Spring Boot后端通信的Angular 6前端。后端使用PostgreSQL作为数据库。我要做的是将用户名发送到数据库,然后返回他的电子邮件,并使用Angular 6将其打印在页面上。 但是,我在Angular POST请求中苦苦挣扎,在订阅该请求时,我在Chrome开发人员工具中遇到了JSON解析错误。

代码

Spring Boot

这很好,因为我已经通过在控制台上打印从数据库返回的电子邮件进行了测试。

@RequestMapping(value = "/reset", method = RequestMethod.POST)
public String resetMail(@RequestBody String username) {
    try{
        User user = userService.findByUsername(username);
        //System.out.println(user.getEmail()); Testing purpose
        return user.getEmail();
    }catch(Exception e) {
        //e.printStackTrace(); Prints out NullException StackTrace.
        return "Not Present";
    }
}

角度6

在以下代码中,我认为问题出在订阅方法中,因为我在Chrome开发人员工具中收到JSON解析错误。

httpOptions = { headers: new HttpHeaders({'Content-Type':'text/plain', 'Access-Control-Allow-Origin': '*'})};

reset(username:string) {
    this.http.post('http://localhost:8090/reset', username, this.httpOptions).subscribe(data=> {
        this.email = data as any;
    });
}
console.log(this.email) // Prints undefined

错误

HttpErrorResponse {headers: HttpHeaders, status: 200, statusText: "OK", url: "http://localhost:8090/reset", ok: false, …}
    >error: {error: SyntaxError: Unexpected token a in JSON at position 0 at JSON.parse (<anonymous>) at XMLHttp…, text: "abcdefg@yahoo.com"}
    >headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}
    message: "Http failure during parsing for http://localhost:8090/reset"
    name: "HttpErrorResponse"
    ok: false
    status: 200
    statusText: "OK"
    url: "http://localhost:8090/reset"

1 个答案:

答案 0 :(得分:0)

您想要将字符串序列化为JSON。如果您的控制器返回一个对象,则@RestController批注将正确地对其进行序列化。如果只想返回一个字符串,则必须返回JSONObject.quote(user.getEmail());您可以从这里http://mvnrepository.com/artifact/org.json/json获取JSONObject依赖项 但我鼓励您始终返回对象,作为其余控制器的响应。