📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

适用版本: 6.8-8.9

1. 错误异常的基本描述 #

这条异常比 request body is required 更具体。contentOrSourceParam() 会先检查请求是否包含 body 或 source 参数,只要两者都没有,就抛出 ElasticsearchParseException("request body or source parameter is required")

常见现象 #

  • 某些查询接口用 GET 调用,但没有附带 source
  • POST/PUT 请求没有 body,同时也没有 source 兜底。
  • 返回通常是 400,而且不会进入真正的 DSL 解析阶段。

典型报错与异常栈 #

ElasticsearchParseException: request body or source parameter is required

2. 为什么会发生这个错误 #

某些接口兼容两种输入方式:

  • 通过请求体提交 JSON
  • 通过 source 参数传入 JSON 字符串

如果两种方式都缺失,Elasticsearch 就拿不到待解析内容,因此直接拒绝请求。常见原因包括:

  • 使用 GET 请求却忘了传 source
  • 客户端没有附带 body。
  • 中间层改写了 query string 或 body。
  • SDK 升级后不再自动填充 source 参数。

3. 如何排查和解决这个异常和解决这个异常 #

  1. 查看目标接口文档,确认它支持的输入形式。
  2. 抓取实际请求,确认 body 和 source 是否都为空。
  3. 如果使用 source,检查 URL 编码和 source_content_type
  4. 如果使用 body,确认内容类型和实际内容都正确。
  5. 在平台层统一一种调用方式,减少兼容分支带来的歧义。

相关 Elasticsearch API 及调用说明 #

curl -G "http://localhost:9200/my-index/_search" \
  --data-urlencode 'source={"query":{"match_all":{}}}' \
  --data-urlencode 'source_content_type=application/json'

排查时需要注意的问题 #

  • source 参数更适合简单兼容场景,复杂请求优先用 body。
  • 网关可能对 URL 长度有限制,过长 source 会被截断。
  • 如果应用同时混用 body 和 source,建议收敛成统一规范。

4. 如何解决这个错误 #

常用修复思路 #

  • 为请求补齐 body。
  • 或者显式传入 sourcesource_content_type
  • 调整代理和 SDK 配置,避免输入内容在中途丢失。
  • 给调用封装增加断言: body 和 source 至少有一个。

后续注意事项与推荐建议 #

  • 不建议长期把复杂 DSL 塞进 URL。
  • 在调用日志里记录最终使用的是 body 还是 source
  • 对关键接口做空 body、空 source 和正常请求三类回归。

借助 INFINI 产品提升排障效率 #

5. 小结 #

request body or source parameter is required 的核心含义是: Elasticsearch 没拿到任何可解析内容。排障重点是确认 body 和 source 哪一步丢了。

相关错误 #

附:日志上下文 #

/* Get the content of the request or the contents of the source param or throw an exception if both are missing. */
public final Tuple contentOrSourceParam() {
 if (hasContentOrSourceParam() == false) {
 throw new ElasticsearchParseException("request body or source parameter is required");
 } else if (hasContent()) {
 return new Tuple<>(xContentType.get(), requiredContent());
 }
 String source = param("source");
 String typeParam = param("source_content_type");