Spring Cloudゲートウェイにおけるクエリ・パームへのパス・パーム変換


問題声明


どのように、私はあなたのAPIのうちの1つについての質問paramsへの着信要求にパス・パスを変えることができますか.

TLドクター


.filters(fs -> fs.rewritePath("/(?<country>.\\S+)/(?<locale>.\\S+)/v(?<version>\\d+)/my-endpoint(?<queryParams>.*)",
                        "/api/v2/my-endpoint?locale=${locale}&country=${country}&"))

解決策


APIの進化は、マイクロサービスベースの開発の一部です.パスのparamsとしてロケールとカントリーを持っていました.我々が同じAPIの新しいバージョンを書いていたので、我々はそれらのパス・パームを代わりにQuery Paramsとして通過させることに決めました.
古いバージョンからより新しいバージョンへの移行をサポートするために、クライアントとAPIの2つのバージョンの間でgatewayを追加することを決めました.
課題は、クライアントが以前のようにロケールと国の情報を送信し続けることになりますが、我々はどうにか、新しいバージョンを呼び出す前にこれらのparamsを変換する必要があります.
驚いたことに、我々は比較的容易にそれを行うことができました.必要なのは、FilterSpecに追加された次のrouteです
.filters(fs -> fs.rewritePath("/(?<country>.\\S+)/(?<locale>.\\S+)/v(?<version>\\d+)/my-endpoint(?<queryParams>.*)",
                        "/api/v2/my-endpoint?locale=${locale}&country=${country}&"))
その場所では、我々のゲートウェイは、クライアントに影響を与えることなく、APIの両方のバージョンに要求をルートすることができます.ここに、ゲートウェイアプリケーションのために集められたログがあります.
Incoming request http://localhost:8081/us/en/v1/my-endpoint?channel=WEB is routed to id: my-api-v2-/us/en/v1/my-endpoint, uri:http://localhost:8080/api/v2/my-endpoint?locale=en&country=us&?channel=WEB
上記のログ文は、stackoverflowの上でこのthreadで利用できるコードを使用することによって生成されました