Dela via


Ange brödtext

GÄLLER FÖR: Alla API Management-nivåer

set-body Använd principen för att ange meddelandetexten för en begäran eller ett svar. För att komma åt meddelandetexten context.Request.Body kan du använda egenskapen eller context.Response.Body, beroende på om principen finns i avsnittet inkommande eller utgående.

Viktigt!

Som standard när du kommer åt meddelandetexten med eller context.Request.Body context.Response.Bodygår den ursprungliga meddelandetexten förlorad och måste anges genom att brödtexten returneras i uttrycket igen. Om du vill bevara brödtextinnehållet anger du parametern preserveContent till true när du kommer åt meddelandet. Om preserveContent anges till true och en annan brödtext returneras av uttrycket används den returnerade brödtexten.

Kommentar

Ange principens element och underordnade element i den ordning som anges i principbeskrivningen. Läs mer om hur du anger eller redigerar API Management-principer.

Principuttryck

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

Attribut

Attribut beskrivning Obligatoriskt Standardvärde
mall Används för att ändra det mallläge som set-body principen körs i. För närvarande är det enda värde som stöds:

- liquid - Principen set-body kommer att använda motorn för flytande templating
Nej Ej tillämpligt
xsi-nil Används för att styra hur element som markerats med xsi:nil="true" representeras i XML-nyttolaster. Ange till något av följande värden:

- blank - nil representeras med en tom sträng.
- null - nil representeras med ett null-värde.

Principuttryck tillåts inte.
Nej blank
parsningsdatum Boolesk. Anger om datumformaterade strängar (till exempel "/Date(1198908717056)/", "2012-03-21T05:40Z") parsas till System.DateTime (mm/dd/yyyy hh:mm:ss). När värdet är inställt på falsekopieras bara datumvärden.

Principuttryck tillåts inte.
Nej true

För åtkomst till information om begäran och svar kan Liquid-mallen binda till ett kontextobjekt med följande egenskaper:

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

Användning

Användningsanteckningar

  • Om du använder set-body principen för att returnera en ny eller uppdaterad brödtext behöver du inte ange preserveContent till true eftersom du uttryckligen anger det nya brödtextinnehållet.
  • Att bevara innehållet i ett svar i den inkommande pipelinen är inte meningsfullt eftersom det inte finns något svar ännu.
  • Att bevara innehållet i en begäran i den utgående pipelinen är inte meningsfullt eftersom begäran redan har skickats till serverdelen i det här läget.
  • Om den här principen används när det inte finns någon meddelandetext, till exempel i ett inkommande GET, genereras ett undantag.

Mer information finns i avsnitten context.Request.BodyIMessageBody , context.Response.Bodyoch i tabellen Sammanhangsvariabel.

Använda Liquid-mallar med set-body

Principen set-body kan konfigureras för att använda språket liquid templating för att transformera brödtexten för en begäran eller ett svar. Detta kan vara effektivt om du behöver omforma meddelandets format helt.

Viktigt!

Implementeringen av Liquid som används i set-body principen konfigureras i C#-läge. Detta är särskilt viktigt när du gör saker som filtrering. Till exempel kräver användning av ett datumfilter användning av Pascal-hölje och C#-datumformatering, t.ex.

{{body.foo.startDateTime| Datum:"åååååMMddTHH:mm:ssZ"}}

Viktigt!

Om du vill binda till en XML-brödtext med hjälp av Liquid-mallen använder du en set-header princip för att ange Innehållstyp till antingen program/xml, text/xml (eller någon typ som slutar med +xml). För en JSON-brödtext måste den vara application/json, text/json (eller någon typ som slutar med +json).

Viktigt!

Flytande mallar använder begäran/svarstexten i den aktuella körningspipelinen som indata. Därför fungerar inte flytande mallar när de används i en retursvarsprincip. En retursvarsprincip avbryter den aktuella körningspipelinen och tar bort begäran/svarstexten. Därför får alla flytande mallar som används i retursvaret en tom sträng som indata och kommer inte att generera förväntade utdata.

Flytande filter som stöds

Följande Liquid-filter stöds i set-body principen. Filterexempel finns i liquid-dokumentationen.

Kommentar

Principen kräver Pascal-hölje för flytande filternamn (till exempel "AtLeast" i stället för "at_least").

  • Abs
  • Lägga till
  • AtLeast
  • Längst upp
  • Kapitalisera
  • Compact
  • Valuta
  • Date
  • Standardvärde
  • DividedBy
  • Nedfall
  • Esc
  • First
  • H
  • Anslut
  • Last
  • Lstrip
  • Mappning
  • Minus
  • Modulo
  • NewlineToBr
  • Plustecken
  • Owner
  • Ta bort
  • RemoveFirst
  • Replace
  • ReplaceFirst
  • Avrunda
  • Rstrip
  • Storlek
  • Sektor
  • Sortera
  • Delad
  • Remsa
  • StripHtml
  • StripNya streck
  • Times
  • Truncate
  • Trunkeraord
  • Uniq
  • Upcase
  • UrlDecode
  • UrlEncode

Exempel

Literal text

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

Komma åt brödtexten som en sträng

Vi bevarar den ursprungliga begärandetexten så att vi kan komma åt den senare i pipelinen.

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

Komma åt brödtexten som en JObject

Eftersom vi inte reserverar den ursprungliga begärandetexten resulterar det i ett undantag när vi kommer åt den senare i pipelinen.

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

Filtrera svar baserat på produkt

Det här exemplet visar hur du utför innehållsfiltrering genom att ta bort dataelement från svaret som tas emot från en serverdelstjänst när du Starter använder produkten. Exempelserverdelssvaret innehåller egenskaper på rotnivå som liknar API:et för OpenWeather One Call.

<!-- 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>

Konvertera JSON till SOAP med hjälp av en Liquid-mall

<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>

Transformera JSON med hjälp av en Liquid-mall

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

Komma åt brödtexten som URL-kodade formulärdata

I följande exempel används AsFormUrlEncodedContent() uttrycket för att komma åt begärandetexten som URL-kodade formulärdata (innehållstyp application/x-www-form-urlencoded) och konverterar det sedan till JSON. Eftersom vi inte reserverar den ursprungliga begärandetexten resulterar det i ett undantag när vi kommer åt den senare i pipelinen.

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

Få åtkomst till och returnera brödtext som URL-kodade formulärdata

I följande exempel används AsFormUrlEncodedContent() uttrycket för att komma åt begärandetexten som URL-kodade formulärdata (innehållstyp application/x-www-form-urlencoded), lägger till data i nyttolasten och returnerar URL-kodade formulärdata. Eftersom vi inte reserverar den ursprungliga begärandetexten resulterar det i ett undantag när vi kommer åt den senare i pipelinen.

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

Mer information om hur du arbetar med principer finns i: