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

适用版本: 6.8-8.9

1. 问题含义 #

could not parse http request template. unexpected object field [field] 表示请求模板里某个字段被写成了 JSON 对象,但解析器不接受它是对象。根据源码片段,当前分支只允许 auth 字段进入对象解析,并调用 BasicAuth.parse(parser)

因此,最常见的触发方式是把 bodyhostpath 等字段写成了对象,或者错误地把认证信息写到了非 auth 字段下面。

2. 直接原因 #

  • 只有 auth 可以是对象,其余字段写成对象都会报错。
  • 把本应是字符串的 HTTP body 直接写成了 JSON 对象。
  • 复制别的 API 配置时带入了当前解析器并不支持的嵌套结构。

3. 排查步骤 #

  1. 先确认异常里的字段名是不是 auth;如果不是,问题基本就是对象放错位置。
  2. 检查 bodypathhost 等字段是否误写成嵌套对象。
  3. 如果需要 Basic Auth,确认结构确实放在 auth 字段下。
  4. 如果需要发送 JSON 正文,把对象先序列化成字符串模板。

4. 修复示例 #

错误示例:

{
  "request": {
    "host": "api.example.com",
    "body": {
      "query": {
        "match_all": {}
      }
    }
  }
}

正确示例:

{
  "request": {
    "host": "api.example.com",
    "auth": {
      "basic": {
        "username": "elastic",
        "password": "secret"
      }
    },
    "body": "{\"query\":{\"match_all\":{}}}"
  }
}

5. 相关错误 #

附:日志上下文 #

    }
} else if (token == XContentParser.Token.START_OBJECT) {
    if (HttpRequest.Field.AUTH.match(currentFieldName, parser.getDeprecationHandler())) {
        builder.auth(BasicAuth.parse(parser));
    } else {
        throw new ElasticsearchParseException("could not parse http request template. unexpected object field [{}]",
            currentFieldName);
    }
} else if (token == XContentParser.Token.VALUE_STRING) {
    if (HttpRequest.Field.SCHEME.match(currentFieldName, parser.getDeprecationHandler())) {
        builder.scheme(Scheme.parse(parser.text()));