복붙노트

[SPRING] Spring Boot 앱에서 API 게이트웨이를 사용할 때 HATEOAS 경로가 유효하지 않습니다.

SPRING

Spring Boot 앱에서 API 게이트웨이를 사용할 때 HATEOAS 경로가 유효하지 않습니다.

나는 그들 중 하나가 API 게이트웨이로 행동하는 두 개의 스프링 부트 애플리케이션을 가지고있다. 첫 번째 파일에 연결된 다른 파일은 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 (이 경우)의 기본 리소스 끝점에 연결되어 바람직하지 않은 경로가 추가되는 것을 방지 할 수있는 방법이 있습니다.

감사!

해결법

  1. ==============================

    1.Zuul 또는 Spring-Cloud는 모든 전달 요청에 "X-Forwarded-Host"헤더를 추가합니다. Spring-hateoas는 링크를 적절히 존중하고 수정합니다. Spring-Cloud 문서에서 인용하기 :

    Zuul 또는 Spring-Cloud는 모든 전달 요청에 "X-Forwarded-Host"헤더를 추가합니다. Spring-hateoas는 링크를 적절히 존중하고 수정합니다. Spring-Cloud 문서에서 인용하기 :

    zuul.addProxyHeaders = false를 설정하는 것이 좋습니다 권장 수정을 시도 할 수 있습니다

  2. ==============================

    2.나는 똑같은 문제가 있었다. 다음과 같이 구성을 변경하십시오.

    나는 똑같은 문제가 있었다. 다음과 같이 구성을 변경하십시오.

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

    이렇게하면 "/ profiles / **"와 일치하는 게이트웨이로가는 모든 요청이 백엔드 서버 "http : // localhost : 8083"로 라우팅되고 접두사가 경로와 일치하는 "/ profiles"에 있습니다.

  3. ==============================

    3.Zuul은 / profiles contextPath로 전달합니다.

    Zuul은 / profiles contextPath로 전달합니다.

    구성으로 설정해보십시오.

    zuul:
      routes:
        profiles:
          path: /profiles/**
          url: http://localhost:8083/
    
  4. ==============================

    4.같은 문제로 고생하고 나서, 마침내 zuul.addProxyHeaders = true로 시도해 보았습니다! 링크가 더 이상 손상되지 않습니다.

    같은 문제로 고생하고 나서, 마침내 zuul.addProxyHeaders = true로 시도해 보았습니다! 링크가 더 이상 손상되지 않습니다.

  5. ==============================

    5.Spring Data REST에 대한 이야기에서 SpringOne에 사용한 데모 응용 프로그램에서 URI 재 작성을 처리하고 접두사 헤더를 올바르게 조정하는 다음 구성을 사용했습니다.

    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에서 전체 내용을 확인하십시오.

  6. from https://stackoverflow.com/questions/30584242/hateoas-paths-are-invalid-when-using-an-api-gateway-in-a-spring-boot-app by cc-by-sa and MIT license