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
相关产品推荐
相关产品推荐

