You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring WebClient Post请求报BadRequest但Postman与curl可正常调用问题

问题排查方向

  • 请求体结构不匹配:参考curl示例,外部API接收的请求体是对象数组格式(外层包裹[]),但你的代码中仅传入单个Message对象转换后的MultiValueMap,序列化后生成的是单个JSON对象,不符合API要求的数组结构,这是最可能的根因。
  • 不必要的MultiValueMap转换:MultiValueMap是表单提交场景使用的数据结构,你已经指定了Content-Type: application/json,完全不需要做这层转换,直接传入序列化后的对象/对象数组即可,多余的转换可能导致JSON结构异常。
  • 日期字段序列化格式不匹配:curl示例中startDate格式为yyyy-MM-dd HH:mm:ss,如果你的Message类中对应字段是LocalDateTime/Date类型,Jackson默认序列化会生成带T的ISO格式或者时间戳,和API要求的格式不符,需要给字段加上@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")注解指定序列化格式。
  • 完整请求日志对比:给WebClient添加请求拦截器,打印出完整的请求头、请求体原始内容,和curl的请求内容逐字段对比,可快速定位差异点。参考拦截器配置示例:
webClient = WebClient.builder()
        .filter(ExchangeFilterFunctions.logRequest())
        .build();
  • 认证信息校验:检查user、pass变量值是否存在多余空格、特殊字符未正确编码的问题,避免Basic Auth认证失败。

修正后的代码参考

public String createMessage(Message requestBody) {
    // 直接把对象包成数组,符合API要求
    List<Message> requestBodyList = Collections.singletonList(requestBody);

    return webClient.post()
            .uri(properties.getMessageUrl())
            .contentType(MediaType.APPLICATION_JSON)
            .headers(headers -> headers.setBasicAuth(user, pass))
            .bodyValue(requestBodyList)
            .retrieve()
            .bodyToMono(String.class)
            .block();
}

内容的提问来源于stack exchange,提问作者Deepak D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:06:03