Estás viendo la documentación de Apigee Edge.
Ve a la
documentación de Apigee X. info

La política SOAPMessageValidation hace lo siguiente:
- Valida cualquier mensaje XML en relación con sus esquemas XSD
- Valida los mensajes SOAP en relación con una definición de WSDL
- Determina el formato adecuada de los mensajes JSON y XML
Si bien el nombre de esta política en la IU es "Validación de mensajes SOAP", la política valida más que solo los mensajes SOAP. En esta sección, se hace referencia a la política como la "política de validación de mensajes".
Elemento <MessageValidation>
Define la política de validación de mensajes.
Valor predeterminado | Consulta la pestaña Política predeterminada, a continuación |
¿Es obligatorio? | Opcional |
Tipo | Objeto complejo |
Elemento principal | No disponible |
Elementos secundarios |
<DisplayName> <Element> <ResourceURL> <SOAPMessage> <Source> |
Sintaxis
El elemento <MessageValidation>
usa la siguiente sintaxis:
<MessageValidation continueOnError="[false|true]" enabled="[true|false]" name="policy_name" > <!-- All MessageValidation child elements are optional --> <DisplayName>policy_display_name</DisplayName> <Element namespace="element_namespace">element_to_validate</Element> <SOAPMessage version="[ 1.1 | 1.2 | 1.1/1.2 ]"/> <Source>message_to_validate</Source> <ResourceURL>validation_WSDL_or_XSD</ResourceURL> </MessageValidation>
Política predeterminada
En el siguiente ejemplo, se muestra la configuración predeterminada cuando agregas una política de validación de mensajes a tu flujo en la IU de Edge:
<MessageValidation continueOnError="false" enabled="true" name="SOAP-Message-Validation-1"> <DisplayName>SOAP Message Validation-1</DisplayName> <Properties/> <Element namespace="http://sample.com">sampleObject</Element> <SOAPMessage/> <Source>request</Source> <ResourceURL>wsdl://SOAP-Message-Validation-1.wsdl</ResourceURL> </MessageValidation>
This element has the following attributes that are common to all policies:
Attribute | Default | Required? | Description |
---|---|---|---|
name |
N/A | Required |
The internal name of the policy. The value of the Optionally, use the |
continueOnError |
false | Optional | Set to "false" to return an error when a policy fails. This is expected behavior for most policies. Set to "true" to have flow execution continue even after a policy fails. |
enabled |
true | Optional | Set to "true" to enforce the policy. Set to "false" to "turn off" the policy. The policy will not be enforced even if it remains attached to a flow. |
async |
false | Deprecated | This attribute is deprecated. |
Ejemplos
En los siguientes ejemplos, se muestran algunas de las formas en las que puedes usar la política de validación de mensajes:
1: Validación de XSD
Puedes usar la política de validación de mensajes para validar la carga útil de una solicitud de mensaje XML en relación con un esquema XSD.
- Crea un nuevo archivo de recursos XSD. Por
ejemplo, “note-schema.xsd”:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="note"> <xs:complexType> <xs:sequence> <xs:element name="to" type="xs:string"/> <xs:element name="from" type="xs:string"/> <xs:element name="heading" type="xs:string"/> <xs:element name="body" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
- Agrega la política de validación de mensajes SOAP al flujo de procesamiento previo de tu extremo de proxy:
- Especifica la ubicación de tu archivo de recursos XSD con el elemento
<ResourceURL>
. Por ejemplo:... <ResourceURL>xsd://note-schema.xsd</ResourceURL> ...
- Quita los elementos
<SOAPMessage>
y<Element>
de la definición de la política.
Tu definición de política debería verse así:
<MessageValidation continueOnError="false" enabled="true" name="validateXMLRequest"> <DisplayName>My XML Validator</DisplayName> <Properties/> <Source>request</Source> <ResourceURL>xsd://note-schema.xsd</ResourceURL> </MessageValidation>
- Especifica la ubicación de tu archivo de recursos XSD con el elemento
- Envía una solicitud
POST
al proxy de tu API con tu XML como carga útil del mensaje de la siguiente manera:curl -v -X POST -H 'Content-Type: application/xml' http://my-test.apigee.net/v1/xsd-mock -d '<note> <to>Fred Rogers</to> <from>Nick Danger</from> <heading>Greetings from my neighborhood</heading> <body>Just writing to say hello.</body> </note>'
Observa que el encabezado
Content-type
está configurado como "application/xml".También puedes crear un archivo de datos para la carga útil y hacer referencia a él con un comando similar al siguiente:
curl -v -X POST -H 'Content-type: application/xml' http://my-test.apigee.net/v1/xsd-mock --data '@../examples/note-payload.xml'
Deberías recibir una respuesta HTTP 200
. Según el extremo objetivo, es posible que recibas detalles adicionales sobre la solicitud. Por ejemplo, si usas http://httpbin.org/post
como tu extremo de destino y especificas un resultado -v
(detallado), la respuesta debería ser similar a la siguiente:
< HTTP/1.1 200 OK < Date: Wed, 16 May 2018 21:24:54 GMT < Content-Type: application/xml < Content-Length: 431 < Connection: keep-alive < Server: gunicorn/19.8.1 < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true < Via: 1.1 vegur { "args":{}, "data":"<note><to>fred</to><from>nick</from><heading>hello</heading> <body>Just writing to say hello.</body></note>", "files":{}, "form":{}, "headers": { "Accept":"*/*", "Connection":"close", "Content-Length":"106", "Content-Type":"application/xml", "Host":"httpbin.org", "User-Agent":"curl/7.58.0" }, "json":null, "origin":"10.1.1.1, 104.154.179.1", "url":"http://httpbin.org/post" }
Para verificar que tu validación de XSD funcione, intenta insertar otra etiqueta en el cuerpo de tu solicitud. Por ejemplo:
curl -v -X POST -H 'Content-Type: application/xml' http://my-test.apigee.net/v1/xsd-mock -d '<note> <to>Fred Rogers</to> <from>Nick Danger</from> <heading>Greetings from my neighborhood</heading> <body>Just writing to say hello.</body> <badTag>Not good</badTag> </note>'
Deberías recibir un error de validación.
2: Validación de SOAP
Puedes usar la política de validación de mensajes para validar la carga útil de una solicitud de mensaje SOAP en una WSDL.
- Crea un archivo de recursos WSDL nuevo. Por ejemplo, “example-wsdl.wsdl”:
- Agrega la política de validación de mensajes SOAP al flujo de procesamiento previo del extremo del proxy:
- Configura el atributo
version
del elemento<SOAPMessage>
en la versión del protocolo SOAP con el que deseas validar. Por ejemplo, “1.1”:... <SOAPMessage version="1.1"/> ...
- Configura el valor del elemento
<Element>
en el elemento que deseas validar:... <Element namespace="https://example.com/gateway">getID</Element> ...
<Element>
especifica el primer elemento secundario debajo del elemento<Body>
en el sobre de la solicitud SOAP.Configura el atributo
namespace
en el espacio de nombres para ese elemento secundario. - Especifica la ubicación de tu archivo de recursos WSDL con el elemento
<ResourceURL>
. Por ejemplo:... <ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL> ...
Tu definición de política debería verse así:
<MessageValidation continueOnError="false" enabled="true" name="validateSOAPRequest"> <DisplayName>My SOAP Validator</DisplayName> <Properties/> <Source>request</Source> <SOAPMessage version="1.1"/> <Element namespace="https://example.com/gateway">getID</Element> <ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL> </MessageValidation>
- Configura el atributo
- Envía una solicitud
POST
al proxy de la API con el sobre SOAP como la carga útil del mensaje, como se muestra en el siguiente ejemplo:curl -v -X POST -H 'Content-Type: application/xml' http://my-test.apigee.net/v1/xsd-mock -d '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prox="https://example.com/gateway" xmlns:typ="https://example.com/gateway/types"> <soapenv:Header/> <soapenv:Body> <prox:getID> <typ:MyType> <typ:ID>42</typ:ID> </typ:MyType> </prox:getID> </soapenv:Body> </soapenv:Envelope>'
Observa que el encabezado
Content-type
está configurado como "application/xml".También puedes crear un archivo de datos para la carga útil y hacer referencia a él con un comando similar al siguiente:
curl -v -X POST -H 'Content-type: application/xml' http://my-test.apigee.net/v1/xsd-mock --data '@../examples/soap-payload.xml'
Deberías recibir una respuesta HTTP 200
. Según el extremo objetivo, es posible que recibas detalles adicionales sobre la solicitud. Por ejemplo, si usas http://httpbin.org/post
como tu extremo de destino, la respuesta debería ser similar a la siguiente:
< HTTP/1.1 200 OK < Date: Wed, 16 May 2018 21:24:54 GMT < Content-Type: application/xml < Content-Length: 431 < Connection: keep-alive < Server: gunicorn/19.8.1 < Access-Control-Allow-Origin: * < Access-Control-Allow-Credentials: true < Via: 1.1 vegur { "args":{}, "data":"<note><to>fred</to><from>nick</from><heading>hello</heading> <body>Just writing to say hello.</body></note>", "files":{}, "form":{}, "headers": { "Accept":"*/*", "Connection":"close", "Content-Length":"106", "Content-Type":"application/xml", "Host":"httpbin.org", "User-Agent":"curl/7.58.0" }, "json":null, "origin":"10.1.1.1, 104.154.179.1", "url":"http://httpbin.org/post" }
3: XML/JSON con formato adecuado
Puedes usar la política de validación de mensajes para confirmar que una carga útil de mensaje JSON o XML tenga el formato correcto (no es igual que la validación). La política garantiza que la estructura y el contenido cumplan con los estándares aceptados, que incluyen lo siguiente:
- Que haya un solo elemento raíz
- Que no haya caracteres ilegales en el contenido
- Que los objetos y las etiquetas estén anidados correctamente
- Que las etiquetas de inicio y fin coincidan
Para comprobar si hay una carga útil con formato XML o JSON, haz lo siguiente:
- Agrega la política de validación de mensajes SOAP al flujo de procesamiento previo del extremo del proxy:
- Quita los elementos
<ResourceURL>
,<SOAPMessage>
y<Element>
de la definición de la política.Tu definición de política debería verse así:
<MessageValidation async="false" continueOnError="false" enabled="true" name="validateXMLRequest"> <DisplayName>My JSON Checker</DisplayName> <Properties/> <Source>request</Source> </MessageValidation>
- Envía una solicitud
POST
a tu proxy de API de la siguiente manera:curl -v -X POST -H 'Content-Type: application/json' http://my-test.apigee.net/v1/xsd-mock -d '{ "note": { "to": "Fred Rogers", "from": "Nick Danger", "header": "Greetings from my neighborhood", "body": "Just writing to say hello." } }'
Observa que el encabezado
Content-type
está configurado como "application/json".Para comprobar si un archivo XML tiene el formato correcto, usa XML como carga útil del mensaje y configura
Content-type
como "application/xml".
Deberías recibir una respuesta HTTP 200
. Si envías una carga útil del mensaje que no contiene XML o JSON con el formato correcto, deberías recibir un error steps.messagevalidation.Failed
.
Referencia del elemento secundario
En esta sección, se describen los elementos secundarios de <MessageValidation>
.
<DisplayName>
Use in addition to the name
attribute to label the policy in the
management UI proxy editor with a different, more natural-sounding name.
The <DisplayName>
element is common to all policies.
Default Value | n/a |
Required? | Optional. If you omit <DisplayName> , the value of the
policy's name attribute is used |
Type | String |
Parent Element | <PolicyElement> |
Child Elements | None |
The <DisplayName>
element uses the following syntax:
Syntax
<PolicyElement> <DisplayName>policy_display_name</DisplayName> ... </PolicyElement>
Example
<PolicyElement> <DisplayName>My Validation Policy</DisplayName> </PolicyElement>
The <DisplayName>
element has no attributes or child elements.
<Element>
Especifica el elemento que se debe validar en el mensaje. Este es el primer elemento secundario dentro del elemento <Body>
en el sobre de la solicitud SOAP.
Valor predeterminado | sampleObject |
¿Es obligatorio? | Opcional |
Tipo | String |
Elemento principal |
<MessageValidation>
|
Elementos secundarios | Ninguno |
El elemento <Element>
usa la siguiente sintaxis:
Sintaxis
... <Element namespace="element_namespace">element_to_validate</Element> ...
Ejemplo 1
El siguiente ejemplo define un solo elemento que se validará:
... <Element namespace="https://example.com/gateway">getID</Element> ...
Ejemplo 2
Puedes especificar más de un elemento para validar si agregas varios elementos <Element>
:
... <Element namespace="https://example.com/gateway">getID</Element> <Element namespace="https://example.com/gateway">getDetails</Element> ...
El elemento <Element>
tiene los siguientes atributos:
Atributo | Predeterminado | ¿Es obligatorio? | Descripción |
---|---|---|---|
namespace |
"http://sample.com" | Opcional | Define el espacio de nombres del elemento que se validará. |
<ResourceURL>
Identifica el esquema XSD o la definición WSDL que se utilizará para validar el mensaje fuente.
Valor predeterminado | wsdl://display_name.wsdl |
¿Es obligatorio? | Opcional |
Tipo | String |
Elemento principal |
<MessageValidation>
|
Elementos secundarios | Ninguno |
El elemento <ResourceURL>
usa la siguiente sintaxis:
Sintaxis
... <ResourceURL>[wsdl|xsd]://validation_WSDL_or_XSD</ResourceURL> ...
Ejemplos
Para un archivo XML:
... <ResourceURL>xsd://note-schema.xsd</ResourceURL> ...
Para un WSDL:
... <ResourceURL>wsdl://example-wsdl.wsdl</ResourceURL> ...
El valor de <ResourceURL>
debe apuntar a un archivo de recursos en tu proxy de API. Este no puede hacer referencia a recursos externos a través de HTTP o HTTPS.
Si no especificas un valor para <ResourceURL>
, se verifica si el mensaje tiene JSON o XML con el formato correcto si el encabezado Content-type
es "application/json" o "application/xml", respectivamente.
El elemento <ResourceURL>
no tiene elementos secundarios ni atributos.
Usa XSD para la validación
Si la carga útil XML que validas con la política de validación de mensajes hace referencia a otro esquema, debes poner el prefijo xsd
el archivo XSD incluido en el atributo schemaLocation
.
El siguiente esquema de ejemplo está compuesto por varios XSD:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:include schemaLocation="xsd://note-schema.xsd"/> <xs:include schemaLocation="xsd://letter-schema.xsd"/> <xs:include schemaLocation="xsd://user-schema.xsd"/> </xs:schema>
Cómo usar WSDL para la validación
Un WSDL debe definir al menos un esquema. Si no hace referencia a, por lo menos, un esquema, la política de validación de mensajes falla.
La profundidad máxima de importación de un esquema es 10. Si excedes esa cantidad de importaciones anidadas, la política de Message Validation falla.
<SOAPMessage>
Define la versión de SOAP con respecto a la que valida la política de validación de mensajes.
Valor predeterminado | n/a |
¿Es obligatorio? | Opcional |
Tipo | n/a |
Elemento principal |
<MessageValidation>
|
Elementos secundarios | Ninguno |
El elemento <SOAPMessage>
usa la siguiente sintaxis:
Sintaxis
... <SOAPMessage version="[ 1.1 | 1.2 | 1.1/1.2 ]"/> ...
Ejemplo
... <SOAPMessage version="1.1"/> ...
El elemento <SOAPMessage>
tiene los siguientes atributos:
Atributo | Predeterminado | ¿Es obligatorio? | Descripción |
---|---|---|---|
version |
Ninguna | Opcional | La versión de SOAP que usa esta política para validar mensajes SOAP.
Estos son los valores válidos:
|
Para obtener más información, consulta Desde SOAP/1.1 hasta SOAP versión 1.2 en 9 puntos.
<Source>
Identifica el mensaje fuente que se validará. El valor de este elemento es el nombre del mensaje que deseas validar.
Si no estableces <Source>
, esta política se establece de forma predeterminada en "message", que hace referencia al mensaje de solicitud completo (en un flujo de solicitud) o al mensaje de respuesta (en un flujo de respuesta), incluida cualquier carga útil. También puedes configurarlo de forma explícita en “solicitud” o “respuesta” para hacer referencia a la solicitud o respuesta.
Valor predeterminado | solicitud |
¿Es obligatorio? | Opcional |
Tipo | String |
Elemento principal |
<MessageValidation>
|
Elementos secundarios | Ninguno |
El elemento <Source>
usa la siguiente sintaxis:
Sintaxis
... <Source>message_to_validate</Source> ...
Ejemplo
... <Source>request</Source> ...
Además de "message", "request" y "response", puedes establecer el valor de <Source>
en el nombre de cualquier mensaje de tu flujo. Sin embargo, si lo haces, debes crear un mensaje personalizado con ese nombre en tu flujo antes de que se ejecute esta política. De lo contrario, aparecerá un error.
Si el valor de <Source>
no se puede resolver en el flujo de mensajes, o se resuelve en un tipo que no es de mensaje, se produce una de las siguientes situaciones:
- Si hay un valor nulo: Edge muestra un error
steps.messagevalidation.SourceMessageNotAvailable
. - Si es un tipo que no es de mensaje: Edge genera un error
steps.messagevalidation.NonMessageVariable
.
El elemento <Source>
no tiene atributos ni elementos secundarios.
Códigos de error
Los errores que muestran las políticas de Edge siguen un formato coherente, como se describe en la referencia del código de error.
This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
Fault code | HTTP status | Cause | Fix |
---|---|---|---|
steps.messagevalidation.SourceMessageNotAvailable |
500 |
This error occurs if a variable specified in the
|
build |
steps.messagevalidation.NonMessageVariable |
500 |
This error occurs if the Message type variables represent entire HTTP requests and responses. The built-in Edge
flow variables |
build |
steps.messagevalidation.Failed |
500 | This error occurs if the SOAPMessageValidation policy fails to validate the input message payload against the XSD schema or WSDL definition. It will also occur if there is malformed JSON or XML in the payload message. | build |
Deployment errors
These errors can occur when you deploy a proxy containing this policy.
Error name | Cause | Fix |
---|---|---|
InvalidResourceType |
The <ResourceURL> element in the SOAPMessageValidation policy is set to a resource type
not supported by the policy.
|
build |
ResourceCompileFailed |
The resource script referenced in the <ResourceURL> element of the SOAPMessageValidation
policy contains an error that prevents it from compiling.
|
build |
RootElementNameUnspecified |
The <Element> element in the SOAPMessageValidation policy does not contain the root
element's name. |
build |
InvalidRootElementName |
The <Element> element in the SOAPMessageValidation policy contains a root element name
that does not adhere to XML rules for valid element naming. |
build |
Esquemas
Un esquema XML (.xsd
) define cada tipo de política. Como referencia, los esquemas de políticas están disponibles en GitHub.