Very often you need to create a sandbox for your API program. But maintaining the Sandbox at your datacenter can be really painful. You have to build it, maintain it, manage uptime etc. etc. A whole lot of work.
You can save yourself a lot of pain by creating a sandbox in Apigee.
Below is a Step by Step guide on how to do it.
**Step 1:**Create a Proxy with no-target
In this case I have created a basePath called /sandbox
Then add an AssignMessage Policy on the response flow. I have named it SendMockData
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<AssignMessage async="false" continueOnError="false" enabled="true" name="SendMockData">
<DisplayName>SendMockData</DisplayName>
<Set>
<Payload contentType="application/json">
\{
"id": 1,
"name": "A green door",
"price": 12.50,
"tags": ["home", "green"]
}
</Payload>
<StatusCode>200</StatusCode>
<ReasonPhrase>OK</ReasonPhrase>
</Set>
</AssignMessage>
Deploy this and call this at {baseUrl}/sandbox.
**Step 2:**Now we want to simulate sending different content-type based on Accept headers:
Add a JsonToXML policy. Just the standard OOB JsonToXML will do and name it JSON-to-XML.
Now at the policy attachment point add a condition to check Accept header.So that your proxy/default.xml look like this:
<PreFlow name="PreFlow">
<Request/>
<Response>
<Step>
<Name>SendMockData</Name>
</Step>
<Step>
<Name>JSON-to-XML</Name>
<Condition>(request.header.Accept = "application/xml")</Condition>
</Step>
</Response>
**Step 3:**Now we add a new flow to create a new API which responds for a URL like sandbox/{id}
So create Flow with condition like
<Flows>
<Flow name="getById">
<Description/>
<Request/>
<Response>
<Step>
<Name>SendMockDataForId</Name>
</Step>
</Response>
<Condition>(proxy.pathsuffix MatchesPath "/{Id}") and (request.verb = "GET")</Condition>
</Flow>
</Flows>
Then add another assignMessage policy to respond to the specific call and name it SendMockDataForId. And configure the payload in it.
Call it at {baseURL}/sandbox/10.
**Step 4:**Now we want to simulate an error response. Your sandbox sends an error response when Id is not 10.
Create an extract Variables policy on the request flow:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ExtractVariables async="false" continueOnError="false" enabled="true" name="Get-ID-from-URL">
<DisplayName>Get ID from URL</DisplayName>
<Properties/>
<URIPath name="extractedId">
<Pattern ignoreCase="true">/{id}</Pattern>
</URIPath>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</ExtractVariables>
Then add an RaiseFault policy which looks like this:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RaiseFault async="false" continueOnError="false" enabled="true" name="Raise-Fault-if-Id-is-not-10">
<DisplayName>Raise Fault if Id is not 10</DisplayName>
<Properties/>
<FaultResponse>
<Set>
<Headers/>
<Payload contentType="application/json">
\{"error": {"message":"Not Found", "detail":"The requested resource was not found."}}
</Payload>
<StatusCode>404</StatusCode>
<ReasonPhrase>The Id is not available</ReasonPhrase>
</Set>
</FaultResponse>
<IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables>
</RaiseFault>
The RaiseFault policy should have a condition. So the flow should look like:
<Flows>
<Flow name="getById">
<Description/>
<Request>
<Step>
<Name>Get-ID-from-URL</Name>
</Step>
<Step>
<Name>Raise-Fault-if-Id-is-not-10</Name>
<Condition>(id !=10)</Condition>
</Step>
</Request>
<Response>
<Step>
<Name>SendMockDataForId</Name>
</Step>
</Response>
<Condition>(proxy.pathsuffix MatchesPath "/{Id}") and (request.verb = "GET")</Condition>
</Flow>
</Flows>
Test it with {baseURL}/sandbox/10
and {baseURL/sandbox}/11
Similarly keep on adding more logic and to create your perfect SandBox.
There is one other huge option: Node.js. If you like to roll up your sleeves and code there is nothing like it. The above procedure is for a configuration approach.
Also all the variables are here hardcoded. You can store them in KVM or BaaS depending on the complexity of the data.