Angular: HttpErrorResponse: «Ошибка Http во время синтаксического анализа для ...» - строка, успешно возвращающаяся с сервера - PullRequest
0 голосов
/ 12 сентября 2018

Spring-boot RESTful серверная часть;метод тестирования, который будет возвращать строку:

@RequestMapping(value = "test", method = RequestMethod.GET)
    public ResponseEntity<String> test(HttpServletRequest req, HttpServletResponse resp) {
        try {
            return new ResponseEntity<String>("Test has worked, biatch!", HttpStatus.OK);
        } catch (Exception e) {
            System.err.println("## EXCEPTION: " + e.getMessage());
            return new ResponseEntity<String>(e.getMessage(), HttpStatus.BAD_REQUEST);
        }
    }

из Почтальона - все отлично работает, и я возвращаю String, правильно проанализированный из JSON.

Однако, когда пытаюсь сделать то же самое из моегоНа стороне клиента, я продолжаю получать сгенерированный объект HttpErrorResponse.

  public url: string = "http://localhost:8080/theater/admin/test";
  constructor(private as: AdminService, private http: HttpClient) { }

  ngOnInit() {
  }

  getTest() {
    this.as.getTest()
      .subscribe(data => console.log(data), // this should happen on success
        error => console.log(error));  // this should happen on error
  }

достаточно забавно, он содержит строку, возвращенную с сервера, и я могу получить к ней доступ с помощью error.text в функции подписки.объект Error на консоли:

HttpErrorResponse {headers: HttpHeaders, status: 200, statusText: "OK", url: "http://localhost:8080/theater/admin/test", ok: false, …}
error
:
{error: SyntaxError: Unexpected token T in JSON at position 0 at JSON.parse (<anonymous>) at XMLHttp…, text: "Test has worked, biatch!"}
headers
:
HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}
message
:
"Http failure during parsing for http://localhost:8080/theater/admin/test"
name
:
"HttpErrorResponse"
ok
:
false
status
:
200
statusText
:
"OK"
url
:
"http://localhost:8080/theater/admin/test"
__proto__
:
HttpResponseBase

Это, вероятно, связано с анализом объекта JSON, возвращаемого с сервера, содержащего String.однако, возвращая объекты, коллекции и все остальное - работает нормально - .subscribe () анализирует все объекты, которые я получаю с сервера правильно, или, если на сервере произошла исключительная ситуация, возвращенный HttpStatus правильно вызывает HttpErrorResponse на стороне клиента.

Итак, что случилось с ошибкой стрельбы Strings?Я всегда получаю HttpErrorResponse, несмотря ни на что.я что-то здесь не так делаю?

Ответы [ 3 ]

0 голосов
/ 07 февраля 2019

Попробуйте что-то вроде этого -

{ responseType: 'text' as 'json' }

Столкнулся с той же проблемой с HttpClient в Angular 7, решенной с помощью описанной выше настройки объекта.

0 голосов
/ 22 марта 2019

Я решил эту проблему с помощью JsonObject, чтобы правильно построить строку JSON, которая затем вставляется в ResponseEntity:

@PostMapping(...)
public ResponseEntity handler(HttpServletRequest req, HttpServletResponse resp) {
  JsonObjectBuilder builder = Json.createObjectBuilder();
  builder.add("text", "Hello World!");
  JsonObject json = builder.build();

  return new ResponseEntity<>(json.toString(), HttpStatus.OK);
}

0 голосов
/ 12 сентября 2018

Тест сработал, biatch!

Это не JSON.Таким образом, ошибка синтаксического анализа.

Это, вероятно, связано с анализом объекта JSON, возвращаемого с сервера, содержащего строку.однако возвращение объектов, коллекций и всего остального - работает нормально - .subscribe ()

Хорошо, это работает для POJO, за исключением того, что они кодируются в JSON.Здесь у вас есть простой String

Чтобы получить ответ в виде строки вместо объекта, сделайте что-то вроде

 http.get(url, {responseType: 'text'})
...