6

Tôi có hai ứng dụng khởi động mùa xuân trong đó một trong số chúng hoạt động như Cổng API (như được thảo luận tại đây Spring Example). Cái kia được nối vào cái đầu tiên là phơi bày một dịch vụ hồ sơ bằng cách sử dụng phần còn lại của dữ liệu vào mùa xuân (spring-data-neo4j-rest).Đường dẫn HATEOAS không hợp lệ khi sử dụng Cổng API trong ứng dụng Khởi động Xuân

Ứng dụng đầu tiên được bắt đầu trên cổng 8080 và đang sử dụng zuul yêu cầu đường đến thứ hai như sau:

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

này tất cả hoạt động tốt và yêu cầu http://localhost:8080/profiles đang được phục vụ từ các ứng dụng thứ hai. Vấn đề là mặc dù các liên kết HATEOAS trong phản hồi là không chính xác. Câu trả lời từ gọi là dịch vụ thứ hai là chính xác:

{ 
    "_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 
    } 
} 

Nhưng khi điều này trở lại với API của tôi Gateway, các liên kết đang được viết lại để

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

Đó là bí danh con đường cửa ngõ cộng với dịch vụ thực tế cơ sở Uri. Tôi có thiếu một tùy chọn zuul để vô hiệu hóa hành vi đó và chỉ cần để lại uri hateoas tại chỗ với một điều chỉnh máy chủ. Hoặc là có một cách để dịch vụ của tôi phía sau cổng được kết nối đến/thay vì sau đó là điểm cuối tài nguyên mặc định của/profiles (trong trường hợp này) sẽ tránh được đường dẫn không mong muốn được thêm vào.

Cảm ơn!

Trả lời

5

Zuul hoặc Spring-Cloud thêm tiêu đề "X-Forwarded-Host" vào tất cả các yêu cầu được chuyển tiếp, mà Spring-hateoas tôn trọng và sửa đổi các liên kết một cách thích hợp. Để trích dẫn từ tài liệu Spring-Cloud:

Tiêu đề X-Forwarded-Host được thêm vào yêu cầu được chuyển tiếp theo mặc định. Để tắt thiết lập zuul.addProxyHeaders = false. Tiền tố đường dẫn bị xóa theo mặc định và yêu cầu tới chương trình phụ trợ chọn một tiêu đề "X-Forwarded-Prefix" ("/ myusers" ) trong các ví dụ ở trên).

Bạn có thể thử sửa chữa khuyến cáo, mà là để thiết lập các zuul.addProxyHeaders=false

+0

Cảm ơn đề xuất. Kết quả của việc thiết lập thành false là các liên kết được trả về là các liên kết trực tiếp đến dịch vụ phụ trợ không mong muốn. Tôi nhận thấy rằng phiên bản spring-hateoas được đưa vào là 0.16.0 nên đã cố gắng thay đổi sự phụ thuộc đó cho đến hiện tại nhưng không có niềm vui. Tôi đã thay đổi đường dẫn api thành/xyz trong cổng để làm cho mọi thứ rõ ràng hơn. Khi tôi yêu cầu một hồ sơ cụ thể như/xzy/0, điều này được gửi nội bộ đến/profiles/0 nhưng liên kết hateoas trong phản hồi kết thúc bằng/xyz/profiles/0/profiles/0 –

0

chuyển tiếp Zuul đến/profiles contextPath.

Cố gắng thiết lập này như cấu hình:

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

Cảm ơn, tôi đã thử điều đó rồi đường dẫn ngữ cảnh từ yêu cầu ban đầu không được chuyển sang dịch vụ. Trong ví dụ trên, tôi nhận được 404 rằng không có gì có sẵn trên/vì Spring Data Rest hiển thị các điểm cuối dựa trên mô hình là/profiles/* cho ví dụ này nhưng cổng không vượt qua trên một cách tự động –

+0

Bạn đã thử zuul : tuyến đường: tiểu sử: đường dẫn:/** url: http: // localhost: 8083/profiles/ ? –

0

Sau khi vật lộn một thời gian với cùng một vấn đề, cuối cùng tôi đã cố gắng zuul.addProxyHeaders = true và nó hoạt động! Liên kết không bị hỏng nữa.

0

Trong ứng dụng demo tôi đã sử dụng cho SpringOne trong bài nói chuyện về REST dữ liệu mùa xuân, tôi có cấu hình sau để xử lý ghi đè URI cũng như điều chỉnh tiêu đề tiền tố được đặt đúng.

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

Nhìn thấy nó đầy đủ tại https://github.com/gregturn/spring-a-gram/blob/master/spring-a-gram-frontend/src/main/resources/application.yml#L23-L32

3

Tôi có chính xác cùng một vấn đề.Thay đổi cấu hình của bạn như sau:

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

này sẽ định tuyến tất cả các yêu cầu đi đến khớp cửa ngõ "/ profiles/**" đến máy chủ back-end của bạn "http://localhost:8083" và rời khỏi tiền tố (trong trường hợp của bạn "/ profiles" vì đó là những gì phù hợp với tuyến đường).

Các vấn đề liên quan