2014-01-21 89 views
1

我需要調用使用GET的遺留API。 我的API代理使用POST。當請求是POST時,在Apigee HTTPTargetConnection上調用GET

我試着使用AssignMessage<AssignTo type="request" createNew="false"/>

<Set> ... <Verb>GET</Verb>

但它仍然無法對目標API一個POST。

什麼是正確的轉換方式? 網關會自動將POST表單參數轉換爲GET查詢參數嗎? message.queryparam GET和POST都一樣嗎?

+1

作爲一個API設計,我建議你不要像這樣將GET轉換爲POST,除非你在代理中進行更多的編排,這符合POST語義。我的建議是尊重POST和GET的語義,而不是使用該工具進行轉換,因爲該工具能夠這樣做。如果你已經考慮過這個問題,你可以忽略這個建議。 – Srikanth

+0

感謝您的提示。是的,我知道這一點。原始API使用GET進行更改的操作,所以它更適合作爲POST。 – mparaz

回答

3

當從POST轉換動詞來GET,政策不會自動轉換形式參數查詢參數。您需要使用AssignMessage策略的<Add>和/或<Remove>功能來進一步操縱消息。在AssignMessage政策例如使用添加queryparams,引用formparams:

<Add> 
    <QueryParams> 
     <QueryParam name="q1">{request.formparam.q1}</QueryParam> 
    </QueryParams> 
</Add> 

而且,在你的問題,你提到的API代理接受的使用方法爲POST請求。然後,你有一個策略來設置GET

<Set> ... <Verb>GET</Verb>

但它仍然無法對目標API一個GET。

什麼問題?這不是你所期望的嗎?該請求作爲POST進入Apigee API代理,代理將方法(動詞)轉換爲GET,並使用GET將請求發送到後端傳統API。

注意:<AssignTo>在AssignMessage中是可選的。如果方法沒有正確設置,請嘗試將其保留。如果不存在,流中當前點的消息將被修改。

+0

我在這個問題上的錯誤。應該是「它仍然在目標API上執行POST」。讓我試試這個。 – mparaz

2

更改此預定義變量後

request.verb = "GET" 

注意:如果你這樣做,你必須根據request.verb =「POST」,不會在響應很好地工作流條件。所以你需要使用另一個變量在流動條件中使用。

以下是適用於我的政策代碼。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<AssignMessage async="false" continueOnError="false" enabled="true" name="changeverbassignmessage"> 
    <DisplayName>ChangeVerbAssignMessage</DisplayName> 
    <FaultRules/> 
    <Properties/> 
    <AssignVariable> 
     <Name>request.verb</Name> 
     <Value>GET</Value> 
     <Ref/> 
    </AssignVariable> 
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> 
    <AssignTo createNew="false" transport="http" type="request"/> 
</AssignMessage> 
+0

正確的地方放在哪裏?我只知道AssignMessage策略。我想: request.verb GET 但它沒有任何效果。 POST仍然發送到目標。 – mparaz

+0

聲音正確。您必須確保您在請求路徑中添加策略,即在擊中目標之前。編輯了答案,添加了適用於我的示例策略。爲了確保您的目標正在接收GET謂詞,請調試跟蹤並選擇目標並查看請求詳細信息。 –

+0

+1在答案中提供了相應的javascript,謝謝! 'context.setVariable('target.verb','GET');' – pulkitsinghal