web-dev-qa-db-ja.com

Angular:HttpErrorResponse: "解析中のHttpエラー..."-サーバーから正常に返される文字列

スプリングブート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);
        }
    }

postmanから-すべてが完全に正常に機能し、JSONから正しく解析された文字列が返されます。

ただし、Angularクライアント側から同じことを試みると、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オブジェクトで、文字列が含まれています。ただし、オブジェクト、コレクション、その他を返すと、まったく問題なく動作します。subscribe()は、サーバーから取得したオブジェクトを正しく解析します。サーバーで例外が発生した場合、返されたHttpStatusは、クライアント側でHttpErrorResponseを正しく呼び出します。

では、Stringsがそのように失火したのはどうしたのでしょうか。何があっても、常にHttpErrorResponseが発生します。私はここで何か間違ったことをしていますか?

2
Maoration

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
loroz