405状态代码未正确返回响应

时间:2014-04-24 18:16:23

标签: apigee

我有一个http方法错误,在请求中发送了错误的http方法时执行。

当我将状态代码设置为405时,请求返回502坏网关。

我的错是:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RaiseFault async="false" continueOnError="false" enabled="true" name="invalid-htttp-method-fault">
    <DisplayName>invalid htttp method fault</DisplayName>
    <FaultRules/>
    <Properties/>
    <FaultResponse>
        <Set>
            <Headers/>
            <Payload contentType="application/xml">
                <Fault>
                    <Code>405</Code>
                    <Description>Method Not Allowed</Description>
</Fault>
      </Payload>
            <StatusCode>405</StatusCode>
            <ReasonPhrase>Method Not Allowed</ReasonPhrase>
        </Set>
    </FaultResponse>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</RaiseFault>

如果我改变

 <StatusCode>405</StatusCode>
                <ReasonPhrase>Method Not Allowed</ReasonPhrase> 

 <StatusCode>403</StatusCode>
                <ReasonPhrase>Method Not Allowed</ReasonPhrase>

我可以看到响应有效负载完美返回。当我使用405时,返回的响应是:

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

2 个答案:

答案 0 :(得分:3)

我能够重现您所面临的确切问题,通过进行更多研究,我发现 HTTP 405响应必须包含Allow-Header

尝试通过添加标题来更改您的错误政策 -

      <Headers>
        <Header name="Allow">YOUR ALLOWED METHODS LIST</Header>
      </Headers>

通过这样做,您不应再获得502坏网关,并将获得您期望的响应。

我希望这会有所帮助。

谢谢!

答案 1 :(得分:0)

啊......有趣。响应405要求每个HTTP规范允许标头(请参阅 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html)。因此,Apigee错误告诉您需要向FaultResponse添加一个Allow标头,如下所示:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RaiseFault async="false" continueOnError="false" enabled="true" name="Fault-405">
    <DisplayName>Fault 405</DisplayName>
    <FaultRules/>
    <Properties/>
    <FaultResponse>
        <Set>
          <Headers>
            <Header name="Allow">GET, PUT, POST, DELETE</Header>
          </Headers>
            <Payload contentType="text/plain">This wasn't supposed to happen</Payload>
            <StatusCode>405</StatusCode>
            <ReasonPhrase>405 Rules</ReasonPhrase>
        </Set>
    </FaultResponse>
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</RaiseFault>

所以在&lt; Set&gt;中添加允许动词阻止,你应该很酷。