Java后端返回String,但是Angular前端不接受它

时间:2019-10-11 14:04:20

标签: angular typescript java-ee

我想做什么:前端将用户名和密码发送到后端。后端检查它,生成一个随机字符串,然后将该字符串发送回前端。前端将该字符串保存到localStorage。

在后端:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public String login(String credentials){
    return this.service.login(credentials);

}

this.service.login返回一个字符串,如果credentials中的用户名和密码确定,否则返回null

在前端:

public login(username: string, password: string ){
return this.http.post<string>(this.authUrl, JSON.stringify({username: username, password: password}), this.getHeaders())
.pipe(
  tap(
    (token:string) => {
      if(token){
        localStorage.setItem('accessToken',token);
        console.log(`Successful login for username =${username} with password=${password} and token=${token}` );
      } else {
        console.log(`Login failed for username =${username} with password=${password} and token=${token}`);
      }
    }
  )
);

}

getHeaders(): {headers: HttpHeaders } {
const httpOptions = {
  headers: new HttpHeaders(
    {
      'Content-type': 'application/json',
      'responseType': 'text'
    }
  )     
};
return httpOptions;

}

如果我尝试使用错误的用户名和密码登录,则会记录以下内容:Login failed for username =something with password=something and token=null因此返回的空部分有效,但是如果我发送正确的用户名和密码,则会出现此错误:

ERROR
HttpErrorResponse {headers: HttpHeaders, status: 200, statusText: "OK", url: "http://localhost:8080/login", ok: false, …}
error: {error: SyntaxError: Unexpected token M in JSON at position 0 at JSON.parse (<anonymous>) at XMLHtt…, text: "MTMyOTUz"}
headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}
message: "Http failure during parsing for http://localhost:8080/login"
name: "HttpErrorResponse"
ok: false
status: 200
statusText: "OK"
url: "http://localhost:8080/login"
__proto__: HttpResponseBase

所以它有一些JSON.parse问题?它是否需要JSON,因此不知道如何处理字符串?有什么解决方案?

2 个答案:

答案 0 :(得分:0)

好的,我不知道如何使用string来完成这项工作,所以我最终使用了json。因此,在this.service.login中:

JsonObject tokenJson = new JsonObject();
tokenJson.addProperty("token", token);
return tokenJson;

然后:

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.TEXT_PLAIN)
public JsonObject login(String json){
    return this.service.login(json);
}

在前端,将返回类型从string更改为object,并按以下方式获取我的令牌:

var tokenObject = JSON.parse(JSON.stringify(token));
localStorage.setItem('accessToken',tokenObject.token);

答案 1 :(得分:0)

默认情况下,httpclient解析json。为了告诉它返回的文本将作为响应,您需要使用以下语法。

this.httpClient.request('GET','url,{responseType:'text'});