【问题标题】:Angular 8 and spring boot api, Required request body is missingAngular 8 和 spring boot api,缺少必需的请求正文
【发布时间】:2020-03-19 14:46:35
【问题描述】:

我有一个小问题。当我使用 Postman 向我的 api 发送请求时,它可以工作,但是当我发送带有角度的东西时,他不喜欢。

邮递员:the request

春节快乐:

@GetMapping("/searchs")
@CrossOrigin(origins = "http://localhost:4200")
public Collection<SearchFeedDTO> getFeed ( @RequestBody String data){
    System.out.println(data);
    System.out.println("I'm here");
    return null;
}

server response

角度代码:

// data = {test:"hello"};
getFeed(data):Observable<boolean>{

   return this.http.get<Answer>(`${this.baseUrl}api/searchs/`,data).pipe(
        map(res=>true),
        catchError(err=>{
            console.error(err);
            return of (false);
      })
   );
}

悲伤的 Spring 响应:“缺少所需的请求正文”

当我尝试这个时,Angular 并不高兴。

return this.http.get<Answer>(`${this.baseUrl}api/searchs/`,{test:"test"}).pipe(

=> 错误“没有与此调用匹配的重载”。

有什么想法吗?

非常感谢!

【问题讨论】:

  • HttpClient 不支持在 GET 请求中发送数据。您需要将方法更改为 POST 或在查询参数中发送数据。

标签: angular spring-boot


【解决方案1】:

HttpClient 不支持在 GET 请求中发送正文。基于@vicb 的评论here

IIRC RFC 不阻止 GET 请求具有正文,但在 实践大多数服务器不支持这个。

来自 GET specification:

GET 请求消息中的有效负载没有定义的语义; 在 GET 请求上发送有效负载正文可能会导致一些现有的 拒绝请求的实现。

因此,您要么需要将请求作为 POST 发送,要么将数据作为查询参数发送。对于多个数据,您可以将数据包含在一个对象中,并将字符串化版本作为查询参数发送。

const test = {test: "test"};
return this.http.get(`${this.baseUrl}api/searchs/?test=` + encodeURIComponent(JSON.stringify(test));

并在后端使用test 变量。

【讨论】:

  • 我要试试这个。谢谢!
【解决方案2】:

通常Get请求不应该有body所以角度httpclient.get也不接受body, 要么你需要通过查询参数发送数据到GET

或将您的后端更改为POST,然后使用正文。如果您的正文只是文本(不是 json),您还需要在角度请求中添加正确的标头

【讨论】:

    【解决方案3】:

    要完成 HTTP 请求,您应该实现订阅者,因为您正在使用 Observable 创建请求。

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 2020-04-19
      • 2022-11-11
      • 2018-02-13
      • 2020-04-01
      相关资源
      最近更新 更多