API XML
Les API XML peuvent être utilisées après l’appel de getAsXmlContent()sur l’objet de demande ou une propriété ParameterValue .
- Appelez getAsXmlContent()sur l’objet de demande ou la propriété ParameterValue . Cela renvoie un objet itérable de la classe sous-jacente XMLContent .
- Appelez getIterator() ou getIterator(String xPath) sur l’objet XMLContent . Cela renvoie un objet XMLElementIterator qui peut être utilisé pour itérer sur des éléments XML.
- Appelez la méthode hasNext() sur l’objet XMLElementIterator pour déterminer si un autre élément est disponible.
- Appelez next() sur l’objet XMLElementIterator pour renvoyer l’élément XML suivant. Vous ne pouvez pas appeler next() sans appeler d’abord hasNext().
- Appelez valueFor(String tableName, String fieldName) sur l’élément XML. Cette méthode indique au proxy que la valeur de cet élément est mappée au champ spécifié dans la table spécifiée. Le proxy vérifie ensuite si le champ doit être chiffré.Remarque :Pour déterminer si vous souhaitez appeler valueFor(String tableName, String fieldName) sur un élément XML, vous pouvez utiliser la méthode getName() pour renvoyer le nom de l’élément.
Mappage à un champ de table connu sur l’instance
Dans cet exemple, la charge utile XML sera traitée sur l’instance pour insérer des enregistrements dans la table d’incidents. Le champ de description renseignera les short_description sur l’incident.
<data>
<record>
<name>'Test Record 1'</name>
<description>'Test Record 1 Description'</description>
<tag>critical</tag>
</record>
<record>
<name>'Test Record 2'</name>
<description>'Test Record 2 Description'</description>
<tag>security</tag>
</record>
</data>L’action de règle de chiffrement suivante peut s’appliquer :
function sampleXmlAction1() {
var xmlContent = request.getAsXmlContent();
// This loop iterates over all description tags that match the given path
var xmlElementIterator = xmlContent.getIterator('data/record/description');
while (xmlElementIterator.hasNext()) {
var xmlElement = xmlElementIterator.next();
xmlElement.valueFor('incident', 'short_decription');
}
}Cette action itère les balises de description et demande au serveur proxy de chiffrer les valeurs et de les insérer dans incident.short_description sur l’instance.
Mappage à un champ de table inconnu sur l’instance
Dans cet exemple, la règle itère sur les balises d’enregistrement , mais ne sait pas à quelles balises s’attendre dans la balise d’enregistrement . La seule chose connue est que les balises dans les balises d’enregistrement correspondent aux noms des colonnes spécifiées dans le paramètre URL de table.
La règle spécifie également que, si la table est incidente, les données de la balise de description doivent être chiffrées et stockées dans le champ short_description de l’instance.
function sampleXmlAction2() {
var xmlContent = request.getAsXmlContent();
var tableName = request.urlParam.table;
// This first iterator will iterate over all record elements
var xmlElementIterator = xmlContent.getIterator('data/record');
while (xmlElementIterator.hasNext()) {
encryptFieldsInRecord(xmlElementIterator.next());
}
}
function encryptFieldsInRecord(xmlElement) {
//Then, iterate over all tags representing fields in the table
var fieldIterator = xmlElement.getIteratorOverAllChildren();
while (fieldIterator.hasNext()) {
var field = fieldIterator.next();
var fieldName = childElement.getName();
//if table is incident, then description is encrypted for the short_description field
if (tableName == 'incident' && fieldName == 'description') {
field.valueFor(tableName, 'short_description');
} else {
//if table is not incident, ask the proxy to check if the given field is encrypted for the given table
field.valueFor(tableName, fieldName);
}
}
}Dans la fonction encryptFieldsInRecord(), la méthode valueFor() est appelée sur une table et un champ qui sont affectés dynamiquement en fonction de la demande. Même si les noms de table et de champ peuvent changer, la règle demande au proxy de vérifier si le champ de la table doit être chiffré en fonction des configurations de chiffrement définies.
Si le champ n’est pas configuré pour le chiffrement ou si la balise ne correspond pas à un champ de la table, le proxy ignore cette balise. Si la balise correspond à un champ marqué pour le chiffrement, le Chiffrement Edge serveur proxy chiffre la valeur.
Utilisation d’une requête codée
Dans cet exemple, toutes les balises ont l’attribut filter , qui indique si la balise contient une requête codée.
<data>
<record>
<name filter="false">'Test Record 1'</name>
<description filter="false">'Test Record 1 Description'</description>
<query filter="true">category=1^name=edge</query>
</record>
<record>
<name filter="false">'Test Record 2'</name>
<description filter="false">'Test Record 2 Description'</description>
<query filter="true">category=2^severity=3</query>
</record>
</data>L’action de règle de chiffrement suivante peut s’appliquer :
function sampleXmlAction3() {
var xmlContent = request.getAsXmlContent();
var tableName = request.urlParam.table;
// This first iterator will iterate over all record elements
var xmlElementIterator = xmlContent.getIterator('data/record');
while (xmlElementIterator.hasNext()) {
encryptFieldsInRecord(xmlElementIterator.next());
}
}
function encryptFieldsInRecord(xmlElement) {
//this time we want to iterate over all tags representing fields in the table
var fieldIterator = xmlElement.getIteratorOverAllChildren();
while (fieldIterator.hasNext()) {
var field = fieldIterator.next();
var fieldname = childElement.getName();
//let's look at the filter attribute, if true, then encrypt as encoded query
if (field.getAttributeValue('filter') == 'true') {
field.encodedQueryFor(tableName);
} else {
//if it is false then check if the field should be encrypted
field.valueFor(tableName, fieldName);
}
}
}Si la valeur de l’attribut de filtre est définie sur vrai, la règle demande au serveur proxy de chiffrer les valeurs de la requête codée. Si faux, la règle demande au proxy de vérifier si le champ doit être chiffré.