【问题标题】:KrakenD HTTP 405 Error When Polling with OPTIONS使用 OPTIONS 轮询时出现 KrakenD HTTP 405 错误
【发布时间】:2022-08-16 07:04:08
【问题描述】:

每次通过 KrakenD API 网关向我的 REST 服务发出 OPTIONS 请求时,我都会收到 HTTP 405 Method Not Allowed 错误。每当我尝试请求 REST 服务的 /apexadapter/version 端点时,都会发生这种情况。当我直接从 API 服务器请求相同的资源时(即当我绕过 KrakenD API 网关时),我没有收到相同的错误。我不明白我为什么会得到这个,我希望你能帮助我理解 Kraken 在做什么,这样我的请求就会引发错误。

根据我阅读的一篇题为Enabling Cross Origin Resource Sharing (CORS) 的文章,我将security/cors 添加到全局extra_config 中。

这是模拟我的请求的 curl 命令:

curl --location --request OPTIONS \'http://localhost:30000/apexadapter/version\'

我的 krakend.json 文件具有以下内容:

{
  \"version\": 2,
  \"timeout\": \"15m\",
  \"cache_ttl\": \"300s\",
  \"output_encoding\": \"json\",
  \"name\": \"apexadapter\",
  \"extra_config\": {
    \"security/cors\": {
      \"allow_origins\": [\"*\"],
      \"allow_methods\": [\"GET\", \"HEAD\", \"POST\", \"OPTIONS\", \"PATCH\", \"DELETE\"],
      \"debug\": true
    }
  },
  \"endpoints\": [
    {
      \"endpoint\": \"/apexadapter/version\",
      \"method\": \"GET\",
      \"output_encoding\": \"no-op\",
      \"backend\": [{
        \"url_pattern\": \"/version\",
        \"method\": \"GET\",
        \"encoding\": \"no-op\",
        \"host\": [
          \"http://apexadapter.apex.svc.cluster.local:38295\"
        ]
      }]
    },
   ... and so on

这是 Postman 输出的结果(我选择测试我的 API 的工具)

OPTIONS http://localhost:30000/apexadapter/version: {
  \"Network\": {
    \"addresses\": {
      \"local\": {
        \"address\": \"::1\",
        \"family\": \"IPv6\",
        \"port\": 51269
      },
      \"remote\": {
        \"address\": \"::1\",
        \"family\": \"IPv6\",
        \"port\": 30000
      }
    }
  },
  \"Request Headers\": {
    \"user-agent\": \"PostmanRuntime/7.29.2\",
    \"accept\": \"*/*\",
    \"cache-control\": \"no-cache\",
    \"postman-token\": \"bf91c1ff-85fe-41e1-ad17-33afee354b2c\",
    \"host\": \"localhost:30000\",
    \"accept-encoding\": \"gzip, deflate, br\",
    \"connection\": \"keep-alive\"
  },
  \"Response Headers\": {
    \"content-type\": \"text/plain\",
    \"date\": \"Fri, 12 Aug 2022 19:40:38 GMT\",
    \"content-length\": \"22\"
  },
  \"Response Body\": \"405 method not allowed\"
}

我注意到响应中的响应标头已完全剥离。尽管 no-op ,我的 Access-Control-Allow-* 标题都没有被返回。

编辑:我向维护者提出了一个问题:https://github.com/krakendio/krakend-ce/issues/545

    标签: cors krakend


    【解决方案1】:

    这听起来不像是特定于 CORS 的问题,因为这些问题在客户端中显示为错误,表明 CORS 响应标头无效或不存在。

    鉴于不允许使用 HTTP 405 方法错误消息,您的问题几乎可以肯定是您的 Web 服务器根本没有设置为允许 OPTIONS 请求:大多数 Web 服务器(例如 Apache)默认只允许 GET 和 POST 请求方法,并且必须更改它们的配置以允许 OPTIONS请求也是如此。

    一旦您允许 OPTIONS 请求,然后根据您的 CORS 配置是否正确,您的应用程序将工作或将向客户端发送特定于 CORS 的错误消息,您应该能够弄清楚。

    【讨论】:

    • OP 声明,当绕过 API 网关时,可以成功调用 Web 服务器。
    • 此时问题在于 API 网关本身不允许 OPTIONS 请求。我对 Kraken 一无所知,但 405 响应本身并不是 CORS 问题 - 这是 OPTIONS 请求“一般”被禁止的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-11-20
    • 2012-02-18
    • 1970-01-01
    • 2021-09-05
    • 2017-09-09
    • 2022-07-14
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多