Angular: HttpErrorResponse :"Http failure during parsing for..." - 从服务器成功返回的字符串

Angular: HttpErrorResponse :"Http failure during parsing for..." - a String returning successfully from server

Spring-启动RESTful服务器端; 一个测试方法,将 return 一个字符串:

@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.

得到正确解析的字符串 returned

但是,当从我的 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
  }

很有趣,它包含从服务器 return 编辑的字符串,我可以在订阅功能上使用 error.text 访问它。 控制台上的错误对象:

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 对象 return 有关,其中包含字符串。 但是,returning 对象、集合和其他任何东西 - 工作得很好 - .subscribe() 正确解析我从服务器获得的任何对象,或者如果服务器发生异常,returned HttpStatus在客户端正确调用 HttpErrorResponse。

那么,Strings 这样的错误触发是怎么回事?无论如何,我总是收到 HttpErrorResponse。我是不是做错了什么?

Test has worked, biatch!

这不是 JSON。从而解析错误。

This probably has to do with parsing the JSON object returning from the server, containing the String. however, returning objects, collections and whatever else- works totally fine- .subscribe()

它适用于 POJO,因为它们是 JSON 编码的。这里有普通的 String

要将响应作为字符串而不是对象,请执行类似

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

尝试这样的事情 -

{ responseType: 'text' as 'json' }

我在 Angular 7 中遇到了与 HttpClient 相同的问题,已使用上述设置解决。

问题是当您在 getpost 上使用 return 类型或像这样来自 httpClient 的任何方法时 -

this.http.get<FooClass>(url)

它假定响应类型是 JSON,因此它期望一个 JSON 对象作为响应。将响应类型设置为 'text' as 'json' 将强制文本响应。

我解决了这个问题,方法是使用 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);
}