2014-03-06 83 views
1

我們希望能夠忽略我們的apikey的http參數名中的大小寫 - 也就是說,我們希望接受將被接受的ApiKey,APIKEY和Apikey(以及所有其他排列)...但似乎request.queryparam.apikey只接受「apikey」作爲HTTP參數。忽略大小寫請求HTTP查詢參數

我們認爲使用ExtractVariable策略與ignoreCase屬性(然後將其分配給另一個變量qp.api_key),但它似乎並不奏效(或者我們不完全理解@ignoreCase的作用)。即,qp .api_key僅在傳遞apikey參數(而不是ApiKey,apiKey等)時纔會分配。

<QueryParam name="apikey"> 
    <Pattern ignoreCase="true">{api_key}</Pattern> 
    <VariablePrefix>qp</VariablePrefix> 
</QueryParam> 

我們如何實現apikey HTTP獲取參數不區分大小寫?

回答

0

我創建了一個Python腳本策略:

import re 

qs = flow.getVariable('request.querystring') 
p = re.compile(r".*apikey=(\w+).*", re.IGNORECASE) 
m = p.match(qs) 
if m is not None: 
    flow.setVariable('qp.api_key', m.group(1)) 

在這種情況下,它被分配到qp.api_key和使用REF爲VerifyApiKey政策。

我想這應該是一個標準的選項提取流程變量(即不區分大小寫PARAM名稱)而不是通過額外的政策做同樣的比較基本的東西。

感謝的快速反應和想法,夥計們。

1

如果API密鑰是在查詢字符串的唯一參數 - 以下會工作

< ExtractVariables異步= "假" continueOnError = "假"啓用= "真正"名= " extractapikey " > <顯示名稱> ExtractApiKey </DisplayName > <變量名稱= " request.querystring " > <模式IGNORECASE = "真" > apikey = {} API_KEY < /模板> < /可變> </ExtractVariables >

+0

不幸的是,還有額外的參數...但是這給了我一個想法,想出答案我想了。謝謝! –

1

IGNORECASE屬性適用於該模式 - 不是名字。

您的模式不包括除您正在接收的變量以外的任何內容,所以在您的情況下它什麼也不做。

但是,圖案可含有包含您所期望的圖案周圍的字符,如:

<QueryParam name="apikey"> 
    <Pattern ignoreCase="true">abc{api_key}</Pattern> 
    <VariablePrefix>qp</VariablePrefix> 
</QueryParam> 

在這種情況下,當你的API代理與調用apikey = ABC123? apikey = ABC123,apikey將被設置爲123

+0

謝謝......它回答了這個問題的一半......那麼我該如何應用不區分大小寫的參數名稱本身呢? –

+0

對!下半場:沒有自動的方式將名稱視爲不區分大小寫。你必須創建每情況下的變化一個QueryParam,如: <圖案IGNORECASE = 「真」> {API_KEY} < Pattern ignoreCase =「true」> {api_key} 您可以將任意數量的這些數據放在一個ExtractVariables策略中。 –

+0

這就是我們現在正在做的...它有點類似的作品,但我覺得必須有一個更優雅的解決方案..謝謝! –

0

+1蘭迪的建議,選擇apikey的合理拼寫,並把所有這些在一個單一的ExtractVariables政策:

apikey 
APIkey 
apiKey 
ApiKey 
APIKey 
APIKEY 

如果您確實想處理所有可能的拼寫,另一個解決方案是使用JavaScript標註。您可以訪問變量message.queryparam.names,該變量是所有查詢參數名稱的集合,或者是查詢字符串本身的message.querystring。遍歷名稱或解析查詢字符串,一旦找到不區分大小寫的匹配參數名稱,請獲取相應的message.queryparam。{queryparam_name}變量。請參閱Apigee docs瞭解可以訪問的可能變量。

0

我建議lowercasing所有的參數,所以代碼可以使用一個標準的命名規則。下面的代碼可以在JavaScript策略中執行,以設置稍後可以在任何後續策略中使用的變量。這些變量將成爲從任何其他地方引用的變量。

function setLowerCaseQueryParams(){ 
    var qpnames = request.queryParams; 
    for(var key in qpnames){ 
     context.setVariable("queryparams." + key.toLowerCase(), request.queryParams[key]); 
    } 
} 
setLowerCaseQueryParams(); 

使用此功能,您可以隨時發送任何字符組合。例如ABCDEFGHIJKL =值,ABCDEFGHIJKL = value或ABCDEFGHIJKL =價值,它都會被作爲訪問:

var queryparamval = context.getVariable('queryparams.abcdefghijkl')