Définir le corps

S’APPLIQUE À : Tous les niveaux de Gestion des API

Utilisez la stratégie set-body pour définir le corps du message pour une requête ou une réponse. Pour accéder au corps du message, vous pouvez utiliser la propriété context.Request.Body ou context.Response.Body, selon que la stratégie se trouve dans la section inbound ou outbound.

Important

Par défaut, lorsque vous accédez au corps du message avec context.Request.Body ou context.Response.Body, le corps du message d’origine est perdu et doit être défini en renvoyant le corps dans l’expression. Pour conserver le contenu du corps, donnez la valeur true au paramètre preserveContent lorsque vous accédez au message. Si preserveContent a la valeur true et qu’un autre corps est renvoyé par l’expression, le corps renvoyé est utilisé.

Notes

Définissez les éléments enfants et de stratégie dans l’ordre fourni dans l’instruction de stratégie. En savoir plus sur comment définir ou modifier des stratégies du service Gestion des API.

Instruction de la stratégie

<set-body template="liquid" xsi-nil="blank | null" parse-date="true | false">
    new body value as text
</set-body>

Attributs

Attribut Description Obligatoire Default
template Permet de modifier le mode de templating dans lequel la stratégie set-body est exécutée. Actuellement, la seule valeur possible est :

- liquid : la stratégie set-body utilisera le moteur de templating liquide
Non N/A
xsi-nil Permet de contrôler la façon dont les éléments marqués avec xsi:nil="true" sont représentés dans les charges utiles XML. Définissez l’une des valeurs suivantes :

- blank - nil est représenté par une chaîne vide.
- null - nil est représenté avec une valeur null.

Les expressions de stratégie ne sont pas autorisées.
Non blank
date de l’analyse Booléenne. Spécifie si les chaînes au format date (par exemple, "/Date(1198908717056)/", "2012-03-21T05:40Z") sont analysées sur System.DateTime (mm/dd/yyyy hh:mm:ss). Quand les valeurs de date sont définies sur false, elles sont simplement copiées.

Les expressions de stratégie ne sont pas autorisées.
Non true

Pour accéder aux informations sur la requête et la réponse, le modèle Liquid peut lier à un objet de contexte aux propriétés suivantes :

context.
    Request.
        Url
        Method
        OriginalMethod
        OriginalUrl
        IpAddress
        MatchedParameters
        HasBody
        ClientCertificates
        Headers

    Response.
        StatusCode
        Method
        Headers
Url.
    Scheme
    Host
    Port
    Path
    Query
    QueryString
    ToUri
    ToString

OriginalUrl.
    Scheme
    Host
    Port
    Path
    Query
    QueryString
    ToUri
    ToString

Utilisation

Notes d’utilisation

  • Si vous utilisez la stratégie set-body pour renvoyer un nouveau corps ou un corps mis à jour, vous n’avez pas besoin de donner la valeur true à preserveContent, car vous fournissez explicitement le nouveau contenu du corps.
  • Conserver le contenu d’une réponse dans le pipeline entrant n’est pas judicieux, car il n’existe encore aucune réponse.
  • Conserver le contenu d’une demande dans le pipeline de sortie n’est pas judicieux, car la demande a déjà été envoyée au service principal à ce stade.
  • Si cette stratégie est utilisée en l’absence de corps de message, par exemple dans une requête GET entrante, une exception est levée.

Pour plus d’informations, consultez les sections context.Request.Body, context.Response.Body et IMessageBody dans le tableau context.Request.Body.

Utilisation de modèles Liquid avec Set body

La stratégie set-body peut être configurée pour utiliser le langage de modèle set-body pour transformer le corps d’une requête ou réponse. Cela peut être efficace si vous avez besoin de modifier complètement le format de votre message.

Important

L’implémentation Liquid utilisée dans la stratégie set-body est configurée en mode « C# ». Cela est particulièrement important lors d’opérations telles que le filtrage. Par exemple, l’utilisation d’un filtre de date nécessite l’emploi de la casse Pascal et de la mise en forme de date de C#, par exemple :

{{body.foo.startDateTime| Date:"yyyyMMddTHH:mm:ssZ"}}

Important

Pour établir correctement une liaison avec un corps XML à l’aide du modèle Liquid, utilisez une stratégie set-header pour définir Content-Type pour application/xml, text/xml (ou n’importe quel type se terminant par +xml). Pour un corps JSON, la valeur doit être application/json, text/json (ou n’importe quel type se terminant par +json).

Important

Les modèles Liquid utilisent le corps de la demande/réponse dans le pipeline d’exécution actuel comme entrée. Pour cette raison, les modèles Liquid ne fonctionnent pas lorsqu’ils sont utilisés dans une stratégie return-response. Une stratégie return-response annule le pipeline d’exécution actuel et supprime le corps de la demande/réponse. Par conséquent, tout modèle Liquid utilisé à l’intérieur de return-response reçoit une chaîne vide comme entrée et ne produit pas la sortie attendue.

Filtres Liquid pris en charge

Les filtres Liquid suivants sont pris en charge dans la stratégie set-body. Pour obtenir des exemples de filtre, consultez la Documentation Liquid.

Notes

La stratégie nécessite la casse Pascal pour les noms de filtre Liquid (par exemple, « AtLeast »et non « at_least »).

  • Abs
  • Ajouter (Append)
  • AtLeast
  • AtMost
  • Capitalize
  • Compact
  • Devise
  • Date
  • Default
  • DividedBy
  • Downcase
  • Caractère d'échappement
  • Premier
  • H
  • Join
  • Dernier
  • Lstrip
  • Mappage
  • Moins
  • Modulo
  • NewlineToBr
  • Plus
  • Prepend
  • Supprimer
  • RemoveFirst
  • Replace
  • ReplaceFirst
  • Round
  • Rstrip
  • Taille
  • Tranche
  • Trier
  • Split
  • Strip
  • StripHtml
  • StripNewlines
  • Heures
  • Tronquer
  • TruncateWords
  • Uniq
  • Upcase
  • UrlDecode
  • UrlEncode

Exemples

Texte littéral

<set-body>Hello world!</set-body>

Accès au corps sous forme de chaîne

Nous conservons le corps de la demande d’origine pour pouvoir y accéder plus tard dans le pipeline.

<set-body>
@{ 
    string inBody = context.Request.Body.As<string>(preserveContent: true); 
    if (inBody[0] =='c') { 
        inBody[0] = 'm'; 
    } 
    return inBody; 
}
</set-body>

Accès au corps sous forme de JObject

Puisque nous ne conservons pas le corps de la demande d’origine, si nous tentons d’y accéder plus tard dans le pipeline, nous obtenons une exception.

<set-body> 
@{ 
    JObject inBody = context.Request.Body.As<JObject>(); 
    if (inBody.attribute == <tag>) { 
        inBody[0] = 'm'; 
    } 
    return inBody.ToString(); 
} 
</set-body>

Filtrer la réponse en fonction du produit

Cet exemple montre comment effectuer un filtrage du contenu en supprimant des éléments de données de la réponse reçue d’un service principal en cas d’utilisation du produit Starter. L’exemple de réponse principale comprend des propriétés de niveau racine similaires à l'API d’appel OpenWeather One.

<!-- Copy this snippet into the outbound section to remove a number of data elements from the response received from the backend service based on the name of the product -->
<choose>
  <when condition="@(context.Response.StatusCode == 200 && context.Product.Name.Equals("Starter"))">
    <set-body>@{
        var response = context.Response.Body.As<JObject>();
        foreach (var key in new [] {"current", "minutely", "hourly", "daily", "alerts"}) {
          response.Property (key).Remove ();
        }
        return response.ToString();
      }
    </set-body>
  </when>
</choose>

Conversion de JSON en SOAP à l’aide d’un modèle Liquid

<set-body template="liquid">
    <soap:Envelope xmlns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
        <soap:Body>
            <GetOpenOrders>
                <cust>{{body.getOpenOrders.cust}}</cust>
            </GetOpenOrders>
        </soap:Body>
    </soap:Envelope>
</set-body>

Transformation de JSON à l’aide d’un modèle Liquid

<set-body template="liquid">
{
"order": {
    "id": "{{body.customer.purchase.identifier}}",
    "summary": "{{body.customer.purchase.orderShortDesc}}"
    }
}
</set-body>

Accédez au corps en tant que données de formulaire encodées par URL

L’exemple suivant utilise l’expression AsFormUrlEncodedContent() pour accéder au corps de la requête en tant que données de formulaire encodées par URL (type de contenu application/x-www-form-urlencoded), puis les convertit en JSON. Puisque nous ne conservons pas le corps de la demande d’origine, si nous tentons d’y accéder plus tard dans le pipeline, nous obtenons une exception.

<set-body> 
@{ 
    var inBody = context.Request.Body.AsFormUrlEncodedContent();
    return JsonConvert.SerializeObject(inBody); 
} 
</set-body>

Accédez et retournez le corps sous forme de données de formulaire encodées par URL

L’exemple suivant utilise l’expression AsFormUrlEncodedContent() pour accéder au corps de la demande en tant que données de formulaire encodées par URL (type de contenu application/x-www-form-urlencoded), ajoute des données à la charge utile et retourne des données de formulaire encodées par URL. Puisque nous ne conservons pas le corps de la demande d’origine, si nous tentons d’y accéder plus tard dans le pipeline, nous obtenons une exception.

<set-body> 
@{ 
    var body = context.Request.Body.AsFormUrlEncodedContent();
    body["newKey"].Add("newValue");
    return body.ToFormUrlEncodedContent(); 
} 
</set-body>

Pour plus d’informations sur l’utilisation des stratégies, consultez :