Ocelot允許在請求下游服務之前和之後轉換頭部.目前Ocelot只支援查詢和替換.這個功能在Github #190提出.我確定這個功能可以在各個方面發揮作用。
新增到請求
這個功能在GitHub #313被提出。
如果你想在你的上游請求中新增一個頭,請在ocelot.json檔案的ReRoute中新增如下配置:
"UpstreamHeaderTransform": {
"Uncle": "Bob"
}
上面例子中,一個鍵為Uncle,值為Bob的頭將被新增到上游服務中。
也支援佔位符(看下面)。
新增到相應
這個功能在GitHub #280被提出。
如果你想在你的下游響應中新增一個頭,請在ocelot.json檔案的ReRoute中新增如下配置:
"DownstreamHeaderTransform": {
"Uncle": "Bob"
},
上面例子中,當請求一個特定ReRoute的時候,Ocelot將返回一個鍵為Uncle,值為Bob的頭。
如果你想返回Butterfly 跟蹤id,需要像下面這樣...
"DownstreamHeaderTransform": {
"AnyKey": "{TraceId}"
},
查詢並替換
為了變換頭,首先我們指定頭的鍵,然後指定我們想要的變換內容,例如
"Test": "http://www.bbc.co.uk/, http://ocelot.com/"
上面鍵是"Test",值是“http://www.bbc.co.uk/,http://ocelot.com/”,這個值的意思是使用http://ocelot.com/替換http://www.bbc.co.uk/,語法是{find},{replace}。希望還算簡單明瞭,更多解釋在下面例子中。
下游請求之前
在ocelot.json的ReRoute中新增如下配置 ,以便用http://ocelot.com/替換http://www.bbc.co.uk/ .Test頭將被替換併傳送到下游服務.
"UpstreamHeaderTransform": {
"Test": "http://www.bbc.co.uk/, http://ocelot.com/"
},
下游請求之後
在ocelot.json的ReRoute中新增如下配置 ,以便用http://ocelot.com/替換http://www.bbc.co.uk/ . 當Ocelot收到下游服務響應之後將進行替換.
"DownstreamHeaderTransform": {
"Test": "http://www.bbc.co.uk/, http://ocelot.com/"
},
佔位符
Ocelot允許在頭不轉換中使用佔位符.
{BaseUrl} - 這個是Ocelot的基本url. 例如http://localhost:5000/. {DownstreamBaseUrl} - 這個是下游服務的基本url 例如http://localhost:5001/. 目前這個只在DownstreamHeaderTransform中起作用. {TraceId} - 這個是Butterfly的跟蹤id.目前這個也只在DownstreamHeaderTransform中起作用.
處理 302 重定向
Ocelot預設會自動遵循重定向,但是如果您想將location頭返回給客戶端,您可能需要將location更改為Ocelot而不是下游服務。 Ocelot可以使用以下配置實現。
"DownstreamHeaderTransform": {
"Location": "http://www.bbc.co.uk/, http://ocelot.com/"
},
"HttpHandlerOptions": {
"AllowAutoRedirect": false,
},
你也可以使用BaseUrl佔位符.
"DownstreamHeaderTransform": {
"Location": "http://localhost:6773, {BaseUrl}"
},
"HttpHandlerOptions": {
"AllowAutoRedirect": false,
},
最後,如果你使用負載均衡的話,你將得到多個下游基地址,所以像上面那樣是不能正常工作的.在這種情況下你可以如下配置.
"DownstreamHeaderTransform": {
"Location": "{DownstreamBaseUrl}, {BaseUrl}"
},
"HttpHandlerOptions": {
"AllowAutoRedirect": false,
},
未來
理想情況下,這個特效能夠支援實際上頭部可以有多個值的情況。目前只是假設一個。 如果它可以查詢和替換多個值應該是非常棒的。
"DownstreamHeaderTransform": {
"Location": "[{one,one},{two,two}"
},
"HttpHandlerOptions": {
"AllowAutoRedirect": false,
},
如果有人想在這一展身手,請自己搞定吧!