2016-03-03 18 views
8

Tôi đang cố gắng chuyển hướng tất cả lưu lượng truy cập cho một tên miền khác. Thay vì chạy một máy chủ đặc biệt cho công việc này, tôi đã cố gắng sử dụng cổng API AWS với lambda để thực hiện chuyển hướng.Có thể sử dụng các ký tự đại diện hoặc các đường dẫn bắt tất cả trong Cổng API AWS

Tôi có làm việc này ok cho đường dẫn gốc "/" nhưng bất kỳ yêu cầu nào cho đường dẫn phụ, ví dụ:/a không được xử lý. Có cách nào để xác định một "bắt tất cả" tài nguyên hoặc xử lý đường dẫn ký tự đại diện?

Trả lời

11

Tính đến tuần trước, API Gateway bây giờ hỗ trợ những gì họ gọi là “Catch-tất cả các biến Path”.

Chi tiết đầy đủ và đi bộ qua đây: API Gateway Update – New Features Simplify API Development

+0

Nếu bạn vẫn đang tìm câu trả lời này Năm 2018, hãy nhìn vào câu trả lời của @ geekQ (https://stackoverflow.com/a/40608247/347777), như một sự bắt kịp tất cả (phù hợp với/a/b/c/d/...) bây giờ là có thể. – Viccari

1

Bạn có thể tạo tài nguyên có biến đường dẫn /{param} và bạn có thể coi đây là trình xử lý đường dẫn ký tự đại diện.

Cảm ơn, - Ka Hou

+0

Cảm ơn, bạn có biết liệu điều này sẽ làm việc với những con đường lồng nhau? tức là nếu tôi sử dụng/{param} thì giá trị này sẽ khớp/a nhưng tôi không chắc nó có khớp với/a/b/c không? Vì tôi đang cố gắng chuyển hướng tất cả lưu lượng truy cập tôi lý tưởng thích có thể nói/* hoặc tương đương. –

+1

xác định tài nguyên cho '/ {param}' sẽ không xử lý đường dẫn lồng nhau. Ví dụ: '/ something' sẽ khớp, nhưng'/something/else' sẽ không khớp với tài nguyên '/ {param}' –

+1

Điều đó là đúng. API Gateway hiện không hỗ trợ nhiều đường dẫn cấp. –

8

Cập nhật: Tính đến tuần trước, API Gateway bây giờ hỗ trợ những gì họ gọi là “biến Path-tất cả Catch”. Xem API Gateway Update – New Features Simplify API Development.


Bạn sẽ cần tạo tài nguyên cho mỗi cấp không may. Lý do cho việc này là API Gateway cho phép bạn truy cập các thông số đó thông qua một đối tượng.

Ví dụ: method.request.path.XXXX

Vì vậy, nếu bạn đã chỉ /{param} bạn có thể truy cập rằng với: method.request.path.param nhưng nếu bạn đã có một con đường lồng nhau (params với dấu gạch chéo), nó sẽ không làm việc. Bạn cũng sẽ nhận được 404 cho toàn bộ yêu cầu.

Nếu method.request.path.param là một mảng thay thế ... thì nó có thể nhận được thông số theo vị trí khi không được đặt tên. Ví dụ: method.request.path.param[] ... Các thông số được đặt tên thậm chí có thể được xử lý ở dưới đó, nhưng việc truy cập chúng sẽ không thực sự dễ dàng. Nó sẽ yêu cầu sử dụng một cái gì đó một số loại ánh xạ đường dẫn JSON (suy nghĩ giống như những gì bạn có thể làm với các mẫu ánh xạ của chúng). Đáng buồn thay, đây không phải là cách nó được xử lý trong API Gateway.

Tôi nghĩ rằng điều đó là tốt bởi vì điều này có thể khiến việc định cấu hình API Gateway trở nên phức tạp hơn. Tuy nhiên, nó cũng hạn chế API Gateway và để xử lý tình huống này, cuối cùng bạn sẽ kết thúc với một cấu hình khó hiểu hơn.

Vì vậy, bạn có thể đi một chặng đường dài ở đây. Tạo cùng một phương thức cho nhiều tài nguyên và thực hiện như sau: /{1}/{2}/{3}/{4}/{5}/{6}/{7} v.v. Sau đó, bạn có thể xử lý từng mức tham số đường dẫn nếu cần.

Nếu số lượng tham số luôn giống nhau, thì bạn may mắn hơn một chút và chỉ cần thiết lập một loạt tài nguyên, nhưng một phương thức ở cuối.

nguồn: https://forums.aws.amazon.com/thread.jspa?messageID=689700&#689700

+1

Tính đến tuần trước, API Gateway hiện hỗ trợ những gì họ gọi là "Biến tất cả các biến đường dẫn": https://aws.amazon.com/blogs/aws/api-gateway-update-new-features-simplify-api-development/ –

+1

Bạn cũng có thể sử dụng yêu cầu 'ANY' và'/{proxy +} '- nhiều hơn chỉ là đường dẫn ký tự đại diện, nhưng phương thức HTTP ký tự đại diện cũng được hỗ trợ \ o/ – Tom

2

Bạn có thể tạo một tài nguyên với con đường như /{thepath+}. Dấu cộng là quan trọng.

Sau đó, trong chức năng lambda của bạn, bạn có thể truy cập các giá trị với cả

  • event.path - luôn chứa đường dẫn đầy đủ
  • hoặc event.queryPathParameters.thepath - chứa phần định nghĩa bởi bạn. Trường hợp sử dụng có thể khác: xác định tài nguyên như /images/{imagepath+} để chỉ khớp các đường dẫn với tiền tố nhất định. Biến sẽ chỉ chứa đường con.

Bạn có thể gỡ lỗi tất cả các giá trị truyền cho hàm số của bạn với: JSON.stringify(event)

Full documentation

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