在Spring Boot应用程序中使用API​​网关时,HATEOAS路径无效

时间:2015-06-01 22:16:10

标签: spring spring-boot spring-data-rest spring-cloud spring-hateoas

我有两个Spring启动应用程序,其中一个充当API网关(如此处所讨论的Spring Example)。连接到第一个的另一个是使用spring-data-rest(spring-data-neo4j-rest)公开配置文件服务。

第一个应用程序从端口8080开始,并使用zuul将请求路由到第二个,如下所示:

zuul:
  routes:
    profiles:
      path: /profiles/**
      url: http://localhost:8083/profiles/  

一切正常,第二个应用程序正在向http://localhost:8080/profiles提出请求。但问题是响应中的HATEOAS链接不正确。调用第二个服务的响应是正确的:

{
    "_links": {
        "self": {
            "href": "http://localhost:8083/profiles{?page,size,sort}",
            "templated": true
        },
        "search": {
            "href": "http://localhost:8083/profiles/search"
        }
    },
    "_embedded": {
        "profiles": [
            {
                "name": "Andrew Rutter",
                "_links": {
                    "self": {
                        "href": "http://localhost:8083/profiles/0"
                    }
                }
            },
            {
                "name": "Andrew Rutter",
                "_links": {
                    "self": {
                        "href": "http://localhost:8083/profiles/1"
                    }
                }
            }
        ]
    },
    "page": {
        "size": 20,
        "totalElements": 2,
        "totalPages": 1,
        "number": 0
    }
}

但是当这回到我的API网关时,链接正被重写为

{
  "name": "Andrew Rutter",
  "_links": {
    "self": {
      "href": "http://localhost:8080/profiles/profiles/0"
    }
  }
}

哪个是网关路径别名加上实际的服务基础Uri。我错过了一个zuul选项来禁用该行为,只是通过主机调整留下hateoas uri。或者有没有办法让我的服务在网关后连接到/而不是/ profiles的默认资源端点(在这种情况下),这将避免添加不需要的路径。

谢谢!

5 个答案:

答案 0 :(得分:6)

Zuul或Spring-Cloud添加了" X-Forwarded-Host"标题为所有转发的请求,Spring-hateoas尊重并适当修改链接。引用Spring-Cloud文档:

  

X-Forwarded-Host标头添加到转发的请求中   默认。要将其关闭,请设置zuul.addProxyHeaders = false。前缀   默认情况下,路径被剥离,对后端的请求会获取   标题" X-Forwarded-Prefix" (" / myusers"在上面的例子中)。

您可以尝试推荐的修补程序,即设置zuul.addProxyHeaders=false

答案 1 :(得分:3)

我有完全相同的问题。按如下方式更改配置:

zuul:
  routes:
    profiles:
      path: /profiles/**
      url: http://localhost:8083
      stripPrefix: false

这会将所有发送到网关的请求路由到" / profiles / **"到你的后端服务器" http://localhost:8083"并留下前缀(在你的情况下" / profiles"因为那是与路线相匹配的。)

答案 2 :(得分:0)

Zuul转发到/ profiles contextPath。

尝试将其设置为配置:

zuul:
  routes:
    profiles:
      path: /profiles/**
      url: http://localhost:8083/

答案 3 :(得分:0)

经过一段时间的努力解决同样的问题后,我终于尝试了zuul.addProxyHeaders = true并且它有效! 链接不再被打破。

答案 4 :(得分:0)

在我讨论Spring Data REST时用于SpringOne的演示应用程序中,我有以下配置来处理URI重写以及正确调整前缀头设置。

zuul:
  routes:
    api:
      path: /api/**
      serviceId: spring-a-gram-backend
      stripPrefix: false
    files:
      path: /files/**
      serviceId: spring-a-gram-mongodb-fileservice
      stripPrefix: false

https://github.com/gregturn/spring-a-gram/blob/master/spring-a-gram-frontend/src/main/resources/application.yml#L23-L32

完整查看