【问题标题】:Calling a GET on the Apigee HTTPTargetConnection when the request was POST当请求为 POST 时在 Apigee HTTPTargetConnection 上调用 GET
【发布时间】:2014-01-22 13:58:08
【问题描述】:

我需要调用一个使用 GET 的旧版 API。 我的 API 代理使用 POST。

我尝试在AssignMessage 中使用: <AssignTo type="request" createNew="false"/>

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

但它仍然在目标 API 上执行 POST。

什么是正确的转换方式? 网关会自动将 POST 表单参数转换为 GET 查询参数吗? message.queryparam 对于 GET 和 POST 是否相同?

【问题讨论】:

  • 作为 API 设计,我建议您不要像这样将 GET 转换为 POST,除非您在代理中进行更多符合 POST 语义的编排。我的建议是尊重 POST 和 GET 的语义,而不是使用该工具进行转换,因为该工具能够这样做。如果你已经考虑过了,你可以忽略这个建议。
  • 感谢您的提示。是的,我知道这一点。原始 API 使用 GET 进行更改的操作,因此最好作为 POST。

标签: apigee


【解决方案1】:

将动词从POST 转换为GET 时,该策略不会自动将表单参数转换为查询参数。您将需要使用AssignMessage 策略的<Add> 和/或<Remove> 功能来进一步处理消息。在AssignMessage 策略中使用示例添加查询参数,引用表单参数:

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

另外,在您的问题中,您提到 API 代理使用 POST 的方法接受请求。然后,你有一个策略来设置GET

&lt;Set&gt; ... &lt;Verb&gt;GET&lt;/Verb&gt;

但它仍然在目标 API 上执行 GET。

有什么问题?这不是你所期待的吗?请求以 POST 的身份进入 Apigee API 代理,代理将方法(动词)转换为 GET,并使用 GET 将请求发送到后端旧版 API。

注意:&lt;AssignTo&gt; 在 AssignMessage 中是可选的。如果方法设置不正确,请尝试将其忽略。如果它不存在,则流中当前点的消息将被修改。

【讨论】:

  • 我在问题中的错误。应该是“它仍然在目标 API 上进行 POST”。让我试试这个。
【解决方案2】:

将此预定义变量更改为 post

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>

【讨论】:

  • 正确的放置位置在哪里?我只知道 AssignMessage 政策。我试过: request.verbGET 但它没有效果。 POST 仍然发送到目标。
  • 听起来正确。您必须确保在请求路径中添加策略,即在达到目标之前。已编辑答案以添加对我有用的示例策略。为确保您的目标接收到 GET 动词,请调试跟踪并选择目标并查看请求详细信息。
  • +1 在答案中提供等效的 javascript,谢谢! context.setVariable('target.verb', 'GET');
猜你喜欢
  • 2015-04-08
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2022-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多