2017-04-03 21 views
0

기본적으로 최종 종단점에서 수신 할 것으로 예상되는 것과는 다른 JSON 입력 객체를 예상하는 프록시를 작성했습니다. 그래서 요청 객체를 하나에서 다른 객체로 연결하기 위해 AssingMessage 정책을 사용하여 json 입력을 변환합니다.APIGEE의 JSON AssignMessage 페이로드에서 null 값을 생략하는 방법은 무엇입니까?

나는 이런 식으로 뭔가를하고 있어요 : 일부 값이 비어있을 때

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-Sample"> 
    <DisplayName>Assign Message-Sample</DisplayName> 
    <Remove> 
     <Headers> 
      <Header name="login_id"/> 
      <Header name="Authorization"/> 
     </Headers> 
     <Payload>true</Payload> 
    </Remove> 
    <Set> 
     <Payload contentType="application/json"> 
    {   
     "valueA": "{clientrequest.valueA}", 
     "valueB": "{clientrequest.valueB}", 
     "valueC": "{clientrequest.valueC}", 
     "valueD": "{clientrequest.valueD}", 
     "valueE": "{clientrequest.valueE}", 
     "valueF": "{clientrequest.valueF}", 
    } 
     </Payload> 
     <Verb>POST</Verb> 
    </Set> 
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> 
    <AssignTo createNew="false" transport="http" type="request"/> 
</AssignMessage> 

문제가 온다. 대상 서버가 비어있는 값 (내 컨트롤에서 이스케이프)을 제대로 처리하지 못합니다.

내 질문 : 값이 비어 있으면 매개 변수를 완전히 건너 뛸 수 있습니까?

나는 이런 식으로 뭔가 (또는 더 나은 대안)을 찾고 있어요 : 나는 내 연구에서 발견 한 내용을 들어

<Payload contentType="application/json"> 
    { 
    <skip-if-empty name="clientrequest.valueA"> 
     "valueA": "{clientrequest.valueA}", 
    </skip-if-empty> 
     "valueB": "{clientrequest.valueB}", 
     ... 
    } 
</Payload> 

답변

0

, 자바 스크립트 정책 일 것 같다.

어떻게 처리하나요?

기본적으로 AssignMessage 실행 바로 전에 javascript 정책을 적용해야합니다. 자바 스크립트 정책에서는 값을 제공하지 않으면 모든 로직을 적용하여 특정 매개 변수를 생략 할 수 있습니다.

예를 들어 ExtractVariables 정책을 사용하여 변수에 요청 값을 추출했다고 가정 해 보겠습니다. 그런 다음 Javascript 정책에서 해당 값의 유효성을 검사하고 결과 JSON 객체를 작성하여 나중에 AssingMessage 정책에서 선택하는 다른 변수에 저장합니다.

자바 스크립트 정책 :

var valueA = context.getVariable("clientrequest.valueA"), 
valueB = context.getVariable("clientrequest.valueB"), 
valueC = context.getVariable("clientrequest.valueC"), 
... 

var result = {}; 

if(valueB) { 
    result.b = valueB; 
} 
if(valueA) { 
    result.a = valueA; 
} 
if(valueC) { 
    result.c = valueC; 
} 
... 

context.setVariable("newInput", JSON.stringify(result)); 

그리고 우리 AssignMessage은 우리가 저장된 변수 데리러 : "newInput"전체 JSON 객체의 문자열이 포함됩니다 :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<AssignMessage async="false" continueOnError="false" enabled="true" name="Assign-Message-Sample"> 
    <DisplayName>Assign Message-Sample</DisplayName> 
    <Remove> 
     <Headers> 
      <Header name="login_id"/> 
      <Header name="Authorization"/> 
     </Headers> 
     <Payload>true</Payload> 
    </Remove> 
    <Set> 
     <Payload contentType="application/json"> 
    {newInput} 
     </Payload> 
     <Verb>POST</Verb> 
    </Set> 
    <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> 
    <AssignTo createNew="false" transport="http" type="request"/> 
</AssignMessage> 

이 솔루션을 나를 위해 잘 일했다. 다른 사람이 도움이되기를 바랍니다.