удаление HttpClient, вызывающего обратный вызов ошибки, когда серверная часть возвращает успешный ответ

#json #angular #angular-httpclient #http-delete

#json #угловой #angular-httpclient #http-delete

Вопрос:

Я пытаюсь удалить простой объект student по его идентификатору. Это работает нормально. но вместо того, чтобы показывать сообщение об успешном завершении, оно возвращает сообщение об успешном завершении в виде сообщения об ошибке.

код серверной части в java ->
код контроллера:

 @DeleteMapping("/student/{$id}")
    public String deleteStudent(@PathVariable int $id){
        return student_service.deleteStudent($id);
    }
  

код службы:

 public String deleteStudent(int $id){
        student_repository.deleteById($id);
        return "student deleted, id: " $id;
    }
  

исходный код в angular ->
код службы:

 public deleteStudentById($id: number): Observable<string>{
    return this.http.delete<string>(this.url   `student/${$id}`);
  }
  

код основного класса:

 deleteStudentById($id: number): void{
    this.httpService.deleteStudentById($id)
      .subscribe(
        (res => console.log(res)),
        (error => console.log(error))
      );
  }
  

Ошибка в консоли:

 HttpErrorResponse {headers: HttpHeaders, status: 200, statusText: "OK", url: "http://localhost:8080/student/3", ok: false, …}
SyntaxError: Unexpected token s in JSON at position 0 at JSON.parse (<anonymous>) at XMLHttpRequest.onLoad (http://localhost:4200/vendor.js:124662:51) at ZoneDelegate.invokeTask (http://localhost:4200/polyfills.js:495:35) at Object.onInvokeTask (http://localhost:4200/vendor.js:82248:33) at ZoneDelegate.invokeTask (http://localhost:4200/polyfills.js:494:40) at Zone.runTask (http://localhost:4200/polyfills.js:263:51) at ZoneTask.invokeTask [as invoke] (http://localhost:4200/polyfills.js:576:38) at invokeTask (http://localhost:4200/polyfills.js:1717:18) at XMLHttpRequest.globalZoneAwareCallback (http://localhost:4200/polyfills.js:1754:25)
message: "Unexpected token s in JSON at position 0"
stack: "SyntaxError: Unexpected token s in JSON at position 0↵    at JSON.parse (<anonymous>)↵    at XMLHttpRequest.onLoad (http://localhost:4200/vendor.js:124662:51)↵    at ZoneDelegate.invokeTask (http://localhost:4200/polyfills.js:495:35)↵    at Object.onInvokeTask (http://localhost:4200/vendor.js:82248:33)↵    at ZoneDelegate.invokeTask (http://localhost:4200/polyfills.js:494:40)↵    at Zone.runTask (http://localhost:4200/polyfills.js:263:51)↵    at ZoneTask.invokeTask [as invoke] (http://localhost:4200/polyfills.js:576:38)↵    at invokeTask (http://localhost:4200/polyfills.js:1717:18)↵    at XMLHttpRequest.globalZoneAwareCallback (http://localhost:4200/polyfills.js:1754:25)"
__proto__: Error
constructor: ƒ SyntaxError()
message: ""
name: "SyntaxError"
__proto__: Object
text: "student deleted, id: 3"
__proto__: Object
headers: HttpHeaders
lazyInit: () => {…}
lazyUpdate: null
normalizedNames: Map(0) {}
__proto__: Object
message: "Http failure during parsing for http://localhost:8080/student/3"
name: "HttpErrorResponse"
ok: false
status: 200
statusText: "OK"
url: "http://localhost:8080/student/3"
__proto__: HttpResponseBase
  

[1]

Текстовое сообщение — это именно то, что я хочу вернуть как успешное сообщение.Но это показывает это как ошибку.

Извините, я забыл раздел объявления. Здесь http — это тип HttpClient.

 private http: HttpClient;
private url: string = 'localhost:8080'; 
private httpService: StudentService; 
  

Скриншот консоли здесь [1]: https://i.stack.imgur.com/dW1Ql.png

Комментарии:

1. Вызов вашего серверной части с помощью cURL (а не Angular) работает? Как выглядит остальная часть службы внешнего интерфейса (например, как http инициализируется)? Подробнее, это не минимально воспроизводимый пример!

2. частный http: HttpClient; n частный url: string = ‘ localhost:8080 ‘; n частный HTTPService: StudentService; n Извините, я забыл раздел объявления. Здесь http — это тип HttpClient.

Ответ №1:

Угловой HTTP-клиент ожидает объект JSON в качестве содержимого ответа. Однако ваша конечная точка предоставляет обычный текст. Пожалуйста, используйте соответствующий тип ответа.

 return this.http.delete<string>(this.url   `student/${$id}`, { responseType: 'text' });
  

Комментарии:

1. TS2322: тип ‘Observable<ArrayBuffer>’ не может быть присвоен типу ‘Observable<string>’. Тип ‘ArrayBuffer’ не может быть присвоен типу ‘string’. IDE не позволяет мне этого делать!!!