2014-03-05 27 views
0

我創建了一個新的API /v1/StatusCache指向我的終點/v1/Status。我的目標是能夠緩存中的數據:使用proxy.basepath緩存在Apigee中

  1. 基於URI
  2. 特定頭

所以,如果用戶1發送請求/v1/StatusCache/1234和相同的用戶發送請求/v1/StatusCache/5678 ,我應該打我的服務器,而不是從第一個請求獲取以前的緩存結果。

另外我們在請求中的用戶標頭(Authorization:Bearer),所以我的第二個目標是如果帶有標頭Authorization:Bearer token1的用戶1發送一個請求到/v1/StatusCache/1234 vs一個擁有標頭Authorization的用戶2:Bearer token2發送一個請求到/v1/StatusCache/1234,我應該得到不同的結果(非緩存結果)

我有代碼爲proxypath,但它只緩存每個請求10秒。我缺少

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ResponseCache async="false" continueOnError="false" enabled="true" name="responsecache-1"> 
    <DisplayName>ResponseCache-1</DisplayName> 
    <FaultRules/> 
    <Properties/> 
    <CacheKey> 
     <Prefix/> 
     <KeyFragment ref="proxy.pathsuffix" type="string">proxy.pathsuffix</KeyFragment> 
    </CacheKey> 
    <Scope>Exclusive</Scope> 
    <ExpirySettings> 
     <ExpiryDate/> 
     <TimeOfDay/> 
     <TimeoutInSec ref="">10</TimeoutInSec> 
    </ExpirySettings> 
    <SkipCacheLookup/> 
    <SkipCachePopulation/> 
</ResponseCache> 

回答

0

我的建議是創建一個變量的值相結合的頭部和pathsuffix值(頭+ pathsuffix) - 以此爲響應緩存的關鍵。

0

嘗試以下方法:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ResponseCache async="false" continueOnError="false" enabled="true" name="responsecache-1"> 
    <DisplayName>ResponseCache-1</DisplayName> 
    <FaultRules/> 
    <Properties/> 
    <CacheKey> 
     <Prefix/> 
     <KeyFragment ref="proxy.pathsuffix" type="string"/> 
     <KeyFragment ref="request.header.Authorization" type="string"/> 
    </CacheKey> 
    <ExpirySettings> 
     <ExpiryDate/> 
     <TimeOfDay/> 
     <TimeoutInSec ref="">60</TimeoutInSec> 
    </ExpirySettings> 
    <SkipCacheLookup/> 
    <SkipCachePopulation/> 
</ResponseCache> 

我用60秒的超時便於測試。

這顯示proxy.pathsuffix + request.header.Authorization值的示例是唯一緩存鍵。想想現在看起來像/1234__Bearer token1的鑰匙。需要組合相同的路徑後綴和授權標頭值以從緩存中返回條目。

另外,當試圖緩存URI時,您可能想要嘗試包含查詢字符串的變量request.uri--這有時會指示響應的樣子。如果使用它,請確保查詢字符串不包含像當前時間戳那樣的唯一值(或者至少在將該參數用作緩存鍵片段之前剝去該參數)。

+0

非常感謝Michael!這工作 – user3385158