Как исправить SyntaxError: Неожиданный токен b в JSON в позиции 0 - PullRequest
1 голос
/ 26 апреля 2019

Я хочу прочитать адрес электронной почты в виде строки из моего бэкэнда, используя Spring MVC.Однако, когда я пытаюсь прочитать его, используя Angular HttpClient, я получаю следующую ошибку:

SyntaxError: Unexpected token b in JSON at position 0 at JSON.parse

Это скриншот ошибки, отображаемой в консоли:

Screenshot of console

Это код, который я использую в Angular для чтения ответа:

public findEmail(username: string): Observable<string> {
  let params = new HttpParams();
  params = params.append('username', username);
  return this.httpClient.get<string>(this.baseUrl + '/findEmail', {params});
}

И это код контроллера Spring, который обеспечивает ответ:

@GetMapping(value = "/findEmail", params = { "username" })
public String findEmail(@RequestParam String username) {
    return utilisateursService.findEmail(username);
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2019

У вас нет ответа JSON, ваш ответ является открытым текстом (адресом электронной почты), что видно по ошибке на первом скриншоте.

Spring по умолчанию использует StringHttpMessageConverter при возврате строки, что означает, что он просто вернет строку и будет использовать text/plain, например foo@example.com.

Это означает, что ответ не будет действительным JSON. Чтобы превратить его в действительный JSON, вам понадобятся дополнительные кавычки, например "foo@example.com".

Решение:

  1. Либо верните JSON-ответ от своего бэкэнда. Это можно сделать, обернув ответ (электронное письмо) внутри класса. Как только вы вернете объекты, Джексон сериализует их как JSON. Например:

    @GetMapping
    public User getUser() {
        // Response will be { "email": "foo@example.com" }
        return new User("foo@example.com");
    }
    
  2. Или указать HttpClient интерпретировать ответ как простой текст, используя опцию responseType. Это также упоминается в документации :

    this.httpClient.get<string>('http://example.org', {responseType: 'text'});
    
  3. Или удалить StringHttpMessageConverter из существующих конвертеров. Это приведет к аварийному преобразованию Джексона, которое преобразует ответ в допустимую строку JSON. Решение для этого можно увидеть в этом ответе .

  4. Кроме того, вы можете просто добавить дополнительные цитаты к вашему ответу. Например, возвращая "\"foo@example.com\"" в вашем контроллере Spring.

0 голосов
/ 26 апреля 2019

Может быть, вы не получаете правильный JSON Object.Check, как только API-ответ и проверить, что правильный JSON исходит от API

...