Java-бэкэнд возвращает String, но Angular-интерфейс не принимает его - PullRequest
0 голосов
/ 11 октября 2019

Что я хочу сделать: Frontend отправляет имя пользователя и пароль на сервер. Backend проверяет его, генерирует случайную строку и отправляет эту строку обратно во внешний интерфейс. Веб-интерфейс сохраняет эту строку в 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 голосов
/ 11 октября 2019

По умолчанию httpclient анализирует json. Чтобы сообщить, что возвращаемый текст придет в качестве ответа, вам необходимо использовать следующий синтаксис:

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

0 голосов
/ 11 октября 2019

Хорошо, я не знал, как получить эту работу с 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...