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);
}
}
来自邮递员-一切正常,我从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
访问它。
控制台上的错误对象:
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
这可能与解析从服务器返回的包含String的JSON对象有关。 但是,返回对象,集合和其他所有对象都可以很好地工作-.subscribe()可以正确解析我从服务器获取的任何对象,或者如果服务器发生异常,则返回的HttpStatus会在客户端正确调用HttpErrorResponse。 / p>
那么,像这样的错火是怎么回事呢?无论如何,我总是得到HttpErrorResponse。我在这里做错什么了吗?
答案 0 :(得分:3)
测试成功了,比阿奇!
这不是JSON。从而解析错误。
这可能与解析从JSON返回的JSON对象有关 服务器,包含字符串。但是,返回对象 集合和其他任何东西都可以正常工作-.subscribe()
它对POJO有用,因为它们是JSON编码的。在这里,您有简单的String
要以字符串而不是对象的形式获取响应,请执行类似的操作
http.get(url, {responseType: 'text'})
答案 1 :(得分:2)
尝试类似的方法-
{ responseType: 'text' as 'json' }
使用上述对象设置解决了Angular 7中HttpClient的相同问题。
答案 2 :(得分:0)
我通过使用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);
}