2014-05-22 3 views
1

현재 Apigee 끝점에서 오류 처리 루틴을 리팩터링하려고합니다. 클라이언트는 JSON 또는 XML 데이터가 반환되도록 요청할 수 있으며 이는 오류 메시지의 형식으로도 확장됩니다. 중복 코드를 줄이기 위해 모든 오류를 JSON에 보관하고 흐름에 두 가지 버전의 오류가있을 필요없이 필요할 때 XML로 변환하려고합니다.Apigee 프록시에서 JSON에서 XML로 오류 메시지를 변환하는 적절한 방법은 무엇입니까?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<AssignMessage async="false" continueOnError="false" enabled="true" name="401-unauthorized-json"> 
    <DisplayName>401UnAuthorized - JSON</DisplayName> 
    <FaultRules/> 
    <Properties/> 
    <Set> 
      <Payload contentType="application/json"> 
       {&quot;error&quot;:{ 
&quot;Fault&quot;:{  
&quot;Error Code&quot;: &quot;401&quot;, 
&quot;Description&quot;:&quot;UnAuthorized&quot;, 
&quot;Response&quot;: &quot;Invalid Apikey. Access Denied&quot; 
} 
}} 
      </Payload> 
     <StatusCode>401</StatusCode> 
     <ReasonPhrase>Unauthorized</ReasonPhrase> 
    </Set> 
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> 
    <AssignTo createNew="false" transport="http" type="response"/> 
</AssignMessage> 

는 XML 정책 자체에 대한 JSON은 특별한 옵션이 기본적으로 비어 : 잘못된 API 키 내 오류 처리기 실행을 사용하고 오류 응답의 JSON 버전을 생성하는 예를 들어

<DefaultFaultRule> 
    <Step> 
     <FaultRules/> 
     <Name>401-unauthorized-json</Name> 
    </Step> 
    <Step> 
     <Condition>(request.header.Accept ~ &quot;*xml&quot;)</Condition> 
     <FaultRules/> 
     <Name>JSON-to-XML</Name> 
    </Step> 
    <AlwaysEnforce>true</AlwaysEnforce> 
</DefaultFaultRule> 
:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<JSONToXML async="false" continueOnError="false" enabled="true" name="JSON-to-XML"> 
    <DisplayName>JSON to XML 1</DisplayName> 
    <FaultRules/> 
    <Properties/> 
    <Options/> 
    <OutputVariable>response</OutputVariable> 
    <Source>response</Source> 
</JSONToXML> 

이 정책은 내 프록시 엔드 포인트에 대한 'DefaultFaultRule'에서 참조

accept 헤더를 xml로 설정하면 JSON-to-XML이 실행되지만 오류 500으로 실패합니다. throw되는 오류는 "JSONToXML [JSON-to-XML] : 소스 응답을 사용할 수 없습니다."

메시지 할당 정책은 오류 문자열을 응답 객체에 넣고 JSON이 반환 될 때 올바르게 작동합니다. 응답 객체가 유효하지 않다는 불평을하는 JSON-XML은 왜 발생합니까? 이 변환이 제대로 작동하도록하기 위해 어떤 메시지를 내 메시지 정책에 넣어야합니까?

+0

안녕하세요, Craig, JSON-XML 정책의 내용을 포함 할 수 있습니까? –

+0

위의 질문을 편집하여 JSON-to-XML 정책을 포함 시켰습니다. 그것에 관해 전혀 특별한 것이 없으며 다른 상황에서 잘 작동합니다. 감사! –

+1

AssignMessage 및 JSONToXML 정책은 소스 및 대상 변수가 제공되지 않은 경우 합당한 컨텍스트 기본값을 사용합니다. AssignMessage 정책의 AssignTo 요소와 JSONToXML 정책의 Source 및 OutputVariable 요소를 제거하고 작동하는지 확인하십시오. 마찬가지로 작동해야하는 "message"라는 명시 적 변수를 사용할 수도 있습니다. –

답변

2

소스 및 대상 변수가 제공되지 않을 경우 AssignMessage 및 JSONToXML 정책은 적절한 컨텍스트 기본값을 사용합니다. 예를 들어 응답 흐름 중에이 필드를 해제하면 응답 메시지가 수정됩니다. FaultRules에서도 작동합니다.

AssignMessage 정책의 AssignTo 요소와 JSONToXML 정책의 Source 및 OutputVariable 요소를 제거하면 DefaultFaultRule 흐름이 작동합니다.

관련 문제