0

我的后端服务器针对特定请求将 HTTP 405 返回到 Apigee 4.23 (OPDK)。但是,后端未能设置标准规定的 405 响应应包含的“ALLOW”标头。

而不是修复我的后端(由于接触长时间运行的代码库的一些限制),我想在我的代理 TargetEndpoint 响应流中处理这种情况并添加 ALLOW 标头。但是,看起来 Apigee 4.23 (OPK) 不允许我这样做,它会将以下响应发送回客户端:

HTTP/1.1 502 Bad Gateway
Content-Type: application/json
Content-Length: 139

{
  "fault":{
    "faultstring":"Received 405 Response without Allow Header",
    "detail": {
      "errorcode":"protocol.http.Response405WithoutAllowHeader"
    }
  }
}

我遵循了有关在 TargetEndpoint 上设置“success.codes”属性的文档:

<HTTPTargetConnection>
        <Properties>
            <Property name="success.codes">405</Property>
        </Properties>
        <URL>https://my.backend.url</URL>
</HTTPTargetConnection>

仍然得到同样的错误。我该如何解决这个问题?我正在使用 Apigee 4.23(本地部署工具包)

4

3 回答 3

0

HTTP.ignore.allow_header.for.405 仅在系统级别检查,而不是针对每个代理。您可以将其视为故障并在故障流中处理,而不是将 405 视为代理中的成功。

<FaultRules>
    <FaultRule name="defaultFaultHandling">
        <Step>
            <Name>AssignMessage-1</Name>
        </Step>
</FaultRule>
</FaultRules>

在 AssignMessage 中,他可以添加 Allow 标头并将响应返回给客户端。

 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="AssignMessage-1">
    <DisplayName>AssignMessage-1</DisplayName>
    <FaultRules/>
    <Properties/>

       <Set>
          <Headers> <Header name="Allow">GET, PUT</Header>   </Headers>      

      </Set>

    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
    <AssignTo createNew="true" transport="http" type="response"/>
</AssignMessage>
于 2013-12-12T02:05:24.427 回答
0

您可以通过以下方式使用成功代码属性。此外,我们没有针对目标端点的 HTTP.ignore.allow_header.for.405 的等效属性。

Test

而不是使用下面的

        <HTTPTargetConnection>
           <Properties>
             <Property name="success.codes">405</Property>
           </Properties>
         <URL>https://my.backend.url</URL>
        </HTTPTargetConnection>

使用以下内容并让我知道它是否有效:

             <HTTPTargetConnection>
                  <Properties>
                     <Property name="additional.success.codes">405</Property>
                  </Properties>
                <URL>https://my.backend.url</URL>
             </HTTPTargetConnection>
于 2014-02-01T07:36:26.567 回答
0

我可以使用流 CatchAll 作为 Flows 中的最后一个流来处理这个问题

<Flows>
  <!--
    ...
    -->
  <Flow name="CatchAll">
    <Request>
      <Step>
        <Name>raiseMethodNotAllowedFaultResponse</Name>
      </Step>
    </Request>
    <Response/>
  </Flow>
</Flows>

相应的提高故障策略

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RaiseFault async="false" continueOnError="false" enabled="true" name="raiseMethodNotAllowedFaultResponse">
  <DisplayName>raiseMethodNotAllowedFaultResponse</DisplayName>
<Properties/>
<FaultResponse>
    <Set>
      <Headers>
        <Header name="Allow">POST</Header>
      </Headers>
      <Payload contentType="text/plain">Method Not Allowed</Payload>
      <StatusCode>405</StatusCode>
      <ReasonPhrase>Method Not Allowed</ReasonPhrase>
    </Set>
  </FaultResponse>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</RaiseFault>
于 2020-12-14T08:28:52.503 回答