JSON APIs
As JSON APIs podem ser usadas depois de chamar getAsJsonContent() no objeto request ou em uma propriedade ParameterValue.
- Chame getAsJsonContent() no objeto request. Isso retorna um objeto iterável da classe JsonNode subjacente.
- Chame iterator() ou getIterator(cadeia de caracteres "xPath") no objeto JsonNode. Isso retorna um objeto JsonNodeIterator que pode ser usado para iterar nós no objeto "JSON".
- Chame o método hasNext() no objeto JsonNodeIterator para determinar se outro elemento está disponível.
- Chame next() no objeto JsonNodeIterator para retornar o próximo elemento "JSON". Você não pode chamar next() sem primeiro chamar hasNext().
- Chame valueFor(cadeia de caracteres "tableName", cadeia de caracteres "fieldName") no elemento "JSON". Este método informa ao proxy que o valor desse elemento é mapeado para o campo especificado na tabela especificada. Dessa forma, o proxy verifica se o campo deve ou não ser criptografado.Nota:Para determinar se você deseja chamar valueFor(cadeia de caracteres "tableName", cadeia de caracteres "fieldName") em um elemento "JSON", você pode usar o método getName() para retornar o nome do elemento.
Mapeamento para um campo-tabela conhecido na instância
Neste exemplo, a carga JSON é processada na instância para inserir registros na tabela de incidentes. O campo de descrição preenche "short_description" no incidente.
{
data: {
records: [
{
"name": "Test Record 1",
"description": "Test Record 1 Description",
"tag": "security"
},
{
"name": "Test Record 1",
"description": "Test Record 1 Description",
"tag": "security"
}],
"query": "assigned_to=3D4860165813e63a00d00abd322244b092^category=vulnerability"
},
"source": "10.11.13.14"
}A seguinte regra pode ser aplicada:
function sampleJsonAction1() {
var jsonContent = request.getAsJsonContent();
// This loop iterates over all description elements in the records array
var jsonNodeIterator = jsonContent.getIterator(’/data/records/description’);
while (jsonNodeIterator.hasNext()) {
var jsonNode = jsonNodeIterator.next();
jsonNode.valueFor('incident', 'short_decription');
}
}
Esta ação itera por meio de nós description e solicita que o servidor proxy criptografe os valores e os insira em "incident.short_description" na instância.
Mapeamento para um campo-tabela desconhecido na instância
Neste exemplo, a regra itera sobre os records, mas não tem certeza de quais nós esperar. O único conhecido é que para cada objeto em records, os nós correspondem aos nomes das colunas especificadas no parâmetro de URL da tabela.
A regra também especifica que, se a tabela for incidente, os dados no nó description devem ser criptografados e armazenados no campo "short_description" na instância.
function sampleJsonAction2() {
var jsonContent = request.getAsJsonContent();
var tableName = request.urlParam.table;
// This first iterator will iterate over all record elements
var jsonNodeIterator = jsonContent.getIterator('data/records');
while (jsonNodeIterator.hasNext()) {
encryptFieldsInRecord(jsonNodeIterator.next());
}
}
function encryptFieldsInRecord(jsonNode) {
//this time we want to iterate over all nodes
var fieldIterator = jsonNode.iterator();
while (fieldIterator.hasNext()) {
var field = fieldIterator.next();
var fieldname = childElement.getName();
if (fieldName == 'description') {
field.valueFor(tableName, 'short_description');
} else {
field.valueFor(tableName, fieldName);
}
}
}Na função encryptFieldsInRecord(), o método valueFor() é chamado em uma tabela e em um campo que são atribuídos dinamicamente com base na solicitação. Mesmo que os nomes da tabela e do campo possam mudar, a regra solicita que o proxy verifique se o campo na tabela deve ser criptografado com base nas configurações de criptografia definidas.
Se o campo não estiver configurado para criptografia ou se o nome do nó não corresponder a um campo na tabela, o proxy ignorará esse nó. Se o nome do nó corresponder a um campo marcado para criptografia, o proxy criptografará o valor.
Uso de uma consulta codificada
function sampleJsonAction3() {
var jsonContent = request.getAsJsonContent();
var tableName = request.urlParam.table;
// This first iterator will iterate over all record elements
var jsonNodeIterator = jsonContent.getIterator('data');
while (jsonNodeIterator.hasNext()) {
var jsonNode = jsonNodeIterator.next();
if (jsonNode.getName() == 'records')
encryptRecors(jsonNodeIterator.next());
else if (jsonNode.getName() == 'query')
jsonNode.encodedQueryFor(tableName);
}
}
function encryptRecords(jsonNode) {
//we iterate over all fields in the node
var recordIterator = jsonNode.iterator();
while (recordIterator.hasNext()) {
encryptFieldsInRecord(recordIterator.next());
}
}
function encryptFieldsInRecord(jsonNode) {
//this time we want to iterate over all nodes
var fieldIterator = jsonNode.iterator();
while (fieldIterator.hasNext()) {
var field = fieldIterator.next();
var fieldname = childElement.getName();
field.valueFor(tableName, fieldName);
}
}Neste exemplo, a regra itera sobre data. Ao encontrar records, ele executa a mesma lógica do segundo exemplo, iterando sobre os campos em cada nó. Quando encontra o nó query, ele chama encodedQueryFor() para criptografar valores que devem ser criptografados na consulta.