当前位置: 首页 > 知识库问答 >
问题:

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

杨景山
2023-03-14

我有两个spring-boot应用程序,其中一个充当API网关(如这里的spring示例所讨论的)。与第一个连接的另一个是使用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的默认资源endpoint(在这种情况下),这样可以避免添加不需要的路径。

谢谢你!

共有3个答案

宫铭
2023-03-14

Zuul转发到/profiles上下文路径。

尝试将其设置为配置:

zuul:
  routes:
    profiles:
      path: /profiles/**
      url: http://localhost:8083/
窦英武
2023-03-14

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

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

这会将所有发送到与“/profiles/**”匹配的网关的请求路由到您的后端服务器“http://localhost:8083”并保留前缀(在您的例子中是“/profiles”,因为它与路由匹配)。

茅炯
2023-03-14

Zuul或Spring-Cloud将“X-Forwarded-Host”头添加到所有转发的请求中,Spring-hateoas会尊重并适当地修改链接。引用Spring-Cloud文档:

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

您可以尝试推荐的修复方法,即将zuul.addProxyHeaders=false设置为

 类似资料:
  • 我有一个springboot应用程序,我试图使用ByteBuddy来测试它。我遇到了类路径问题,我无法理解。 首先,以下是关于这方面的其他文献: https://github.com/raphw/byte-buddy/issues/473 这里需要注意的一点是,如果我使用IntelliJ运行应用程序,它不会使用uber-jar,而是通过main类运行,其中有一堆JAR作为类路径参数。 由于这种差异

  • 我已经使用Spring初始值设定项、嵌入式Tomcat、Thymeleaf模板引擎和作为可执行JAR文件的包生成了一个Spring Boot web应用程序。 使用的技术: Spring启动2.0.0。M6,Java8, Maven 这是我的安全配置 在我的 但当我在http://localhost:1234/iberiaWebUtils,而不是去http://localhost:1234/ibe

  • 我是kubernetes的新手,需要在openshift平台上使用k8s confimap将springboot应用程序的属性文件外部化。我已将属性文件保存在git repo中,作为“greeter.message=Spring Bootmyapplication.properties已在库伯内特斯上挂载为卷!”并使用“oc create confimap myconfig--from-file=

  • 我创建了一个节点。js(使用ExpressJS)微服务,并使用向Eureka Discovery Server注册。 我已经在Eureka注册了一些基于Java的微服务,并通过Zuul API网关使用它们。 当我尝试调用节点上的特定endpoint时。js微服务通过API网关,抛出错误: 注意:是我的演示服务应用程序的名称。

  • 换句话说,我的API网关将使用API网关中定义的相同的资源处理对的请求和对的另一个请求,而不必在API网关中定义和资源。