为什么在通过 KrakenD API 网关访问 API 端点时返回 HTTP 500?

Why is an HTTP 500 returned when hitting API endpoint via KrakenD API Gateway?

问题总结:

我在 192.168.23.231 上有一个 k3s 实例 运行。端口 30001 映射到我构建的 REST API 应用程序。端口 31166 映射到 Krakend。当我在浏览器中输入 http://192.168.23.231:31166/datamanager/hello 时,我收到一条 HTTP 500 错误消息,指出“http://192.168.23.231 目前无法处理此请求。”

如果我浏览 http://192.168.23.231:30001/hello,我会按预期得到“Hello World”,所以我知道 REST API 是 运行正确。我的期望是 Krakend 端点会 return 同样的事情,但事实并非如此。

这是我的 krakend.json 配置文件的摘录,显示端点配置:

"endpoints": [
    {
      "endpoint": "/datamanager/hello",
      "method": "GET",
      "output_encoding": "string",
      "extra_config": {},
      "backend": [
        {
          "url_pattern": "/hello",
          "encoding": "json",
          "sd": "static",
          "method": "GET",
          "extra_config": {},
          "host": [
            "http://datamanager.my-test.svc.cluster.local:4567"
          ],
          "disable_host_sanitize": false
        }
      ]
    },

除非我记错了,192.168.23.231:31166/datamanager/hello 应该被 Krakend 路由到 datamanager.my-test.svc.cluster.local:4567/hello

我已经尝试 google 解决,但结果似乎与我的问题不太吻合。

500 错误是 KrakenD 无法处理您的后端响应时的默认状态代码。

在您展示的 KrakenD 配置中,我们可以看到您告诉 KrakenD 来自后端(encoding)的响应是一个 JSON 对象,而不是您的后端 returns 一个字符串 Hello World,它不是 JSON.

KrakenD 日志将显示如下内容:

Error #01: invalid character 'H' looking for beginning of value

H 来自 Hello World。

如果您想使用字符串而不是 json,请使用 string 作为 encoding 的值。如果您想要来自后端的响应,请在 encodingoutput_encoding

中使用 no-op