向服务器发送 POST 请求,服务器的响应为空,Angular - Spring-boot

Posted

技术标签:

【中文标题】向服务器发送 POST 请求,服务器的响应为空,Angular - Spring-boot【英文标题】:Send POST request to server, Server's response is null, Angular - Spring-boot 【发布时间】:2019-12-30 16:01:17 【问题描述】:

我想用我的 Angular 客户端向我的 spring-boot 服务器发送一个 POST 请求。

服务器成功接收到数据和anwser,代码为200,正文包含“ok”。

但是客户端收到 null 作为 anwser。

角度代码:

httpOptions = 
        headers: new HttpHeaders(
            'Content-Type': 'application/json',
            'Accept': 'application/json',
            'Access-Control-Allow-Methods': 'POST, GET'
        )
    ;
this.http.post(this.URL, JSON.stringify(this.alert), this.httpOptions)
            .subscribe((result: string) => 
                if (result == null || result === 'error') 
                    //if fail;
                 else 
                    //if success;
                
                console.log('result :' + result);
            )

春季启动代码:

    @CrossOrigin(origins = "http://localhost:9000")
    @PostMapping(value = "/url")
    public ResponseEntity objDataController(@RequestBody ObjData objData) 
        HttpHeaders resHeader = new HttpHeaders();

        resHeader.set("origin", "http://localhost:8080");
        resHeader.set("Content-Type", "application/json");
        resHeader.set("Accept", "application/json");

        //some code

        return ResponseEntity.ok()
                .headers(resHeader)
                .body("ok");
    

在 console.log 获取: result :null

谢谢

【问题讨论】:

您能否发送实际请求的屏幕截图(浏览器控制台的网络选项卡)。一切都在本地主机上运行吗?这可能是由于预检请求失败导致的一些 cors 问题。 你看过 f12 控制台的响应了吗? @marcel 是的,服务器和客户端都在本地主机中,这就是我在 spring-boot 上使用 @CrossOrigin 的原因 @JensAlenius 是的,回复说result :null 在 Angular 中,订阅方法回调首先是成功然后是错误。所以 HttpClient 将其视为成功。例如: .subscribe(successCallback,failureCallback) 并调用成功,正如我们在您的控制台中看到的那样。我认为身体可能是空的。你检查过 f12 中的 responsebody 吗? 【参考方案1】:

有一个类似的问题,它有助于指定响应类型:

const headers = new HttpHeaders('Content-Type': 'application/json');
this.httpClient.delete(url, headers: headers, responseType: 'text');

【讨论】:

谢谢,但我想这对我没有帮助,我使用 POST 而不是 DELETE,我的问题是 .subscribe 可能仍然值得一试。 “我的问题在于订阅”是什么意思?因为如果您的 httpClient 尝试将“OK”字符串解释为 JSON,它将不会返回该字符串...【参考方案2】:

这是 chrome 控制台在惹你生气,当涉及到 observables 时,它无法正确解释该值。我猜如果您在“如果成功”块中使用结果,它一定会起作用

【讨论】:

【参考方案3】:

好的,我解决了我的问题,我改变了这个:

return ResponseEntity.ok()
                .headers(resHeader)
                .body("ok");

作者:

Gson gson = new Gson();
return ResponseEntity.ok()
                .headers(resHeader)
                .body(gson.toJson("ok", String.class));

感谢您的回答!

【讨论】:

以上是关于向服务器发送 POST 请求,服务器的响应为空,Angular - Spring-boot的主要内容,如果未能解决你的问题,请参考以下文章

AJAX 请求正文为空(无 jQuery)

IT兄弟连 JavaWeb教程 使用AJAX发送POST请求并获取响应

向服务器发出 JSON POST 请求,接收二进制响应(Excel 文件),如何下载?

Telegram 向 webhook 发送重复的 POST JSON 请求

如何断言应用程序使用 POST 请求向 API 服务器发送正确的数据

AJAX 的GET和POST方法(向服务器发送请求)