Set body (Imposta corpo)

SI APPLICA A: Tutti i livelli di Gestione API

Usare il set-body criterio per impostare il corpo del messaggio per una richiesta o una risposta. Per accedere al corpo del messaggio è possibile usare la proprietà context.Request.Body o context.Response.Body, a seconda che il criterio sia nella sezione inbound o outbound.

Importante

Per impostazione predefinita, quando si accede al corpo del messaggio usando context.Request.Body o context.Response.Body, il corpo del messaggio originale viene perso e deve essere impostato restituendo il corpo nell'espressione. Per mantenere il contenuto del corpo, impostare il parametro preserveContent su true quando si accede al messaggio. Se preserveContent è impostato su true e l'espressione restituisce un corpo diverso, viene usato il corpo restituito.

Nota

Impostare gli elementi e gli elementi figlio del criterio nell'ordine specificato nell'istruzione dei criteri. Altre informazioni su come impostare o modificare i criteri di Gestione API.

Istruzione del criterio

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

Attributi

Attributo Descrizione Richiesto Valore predefinito
annidato Consente di modificare la modalità di creazione modelli in cui viene eseguito il set-body criterio. Al momento, l'unico valore supportato è:

- liquid - il set-body criterio userà il motore di templating liquido
No N/D
xsi-nil Utilizzato per controllare il modo in cui gli elementi contrassegnati con xsi:nil="true" vengono rappresentati nei payload XML. Impostare su uno dei valori seguenti:

- blank - nil è rappresentato con una stringa vuota.
- null - nil è rappresentato con un valore Null.

Le espressioni di criteri non sono consentite.
No blank
parse-date Booleano. Specifica se le stringhe in formato data (ad esempio , "/Date(1198908717056)/") "2012-03-21T05:40Z"vengono analizzate in System.DateTime (mm/dd/yyyy hh:mm:ss). Se impostato su false, i valori di data vengono semplicemente copiati.

Le espressioni di criteri non sono consentite.
No true

Per accedere alle informazioni sulla richiesta e sulla risposta, il modello Liquid può essere associato a un oggetto contesto con le proprietà seguenti:

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

Utilizzo

Note sull'utilizzo

  • Se si usa il set-body criterio per restituire un corpo nuovo o aggiornato, non è necessario impostare preserveContent su true perché si sta specificando in modo esplicito il nuovo contenuto del corpo.
  • Il mantenimento del contenuto di una risposta nella pipeline in ingresso non ha senso perché non esiste ancora alcuna risposta.
  • Non ha senso neanche mantenere il contenuto di una risposta nella pipeline in uscita perché a questo punto la richiesta è già stata inviata al back-end.
  • Se questo criterio viene usato quando non è presente alcun corpo del messaggio, ad esempio in un in ingresso GET, viene generata un'eccezione.

Per altre informazioni, vedere le sezioni context.Request.Body, context.Response.Bodye IMessageBody nella tabella Variabile di contesto.

Uso dei modelli Liquid con set-body

Il criterio set-body può essere configurato per l'uso del linguaggio di modellazione Liquid per trasformare il corpo di una richiesta o di una risposta. Questo può essere efficace se è necessario modificare completamente il formato del messaggio.

Importante

L'implementazione di Liquid usato nel criterio set-body è configurato in "modalità C#". Questo è particolarmente importante quando si eseguono operazioni quali l'applicazione del filtro. Ad esempio, l'uso di un filtro data richiede l'uso della convenzione Pascal e della formattazione delle date C#, ad esempio:

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

Importante

Per eseguire correttamente l'associazione a un corpo XML utilizzando il modello Liquid, usare un criterio set-header per impostare il tipo di contenuto su application/xml, text/xml (o su qualsiasi tipo che termini con +xml); per un corpo JSON, deve essere application/json, testo/json (o qualsiasi tipo che termini con +json).

Importante

I modelli liquid usano il corpo della richiesta/risposta nella pipeline di esecuzione corrente come input. Per questo motivo, i modelli liquidi non funzionano quando vengono usati all'interno di un criterio di risposta restituita. Un criterio di risposta restituita annulla la pipeline di esecuzione corrente e rimuove il corpo della richiesta/risposta. Di conseguenza, qualsiasi modello liquido usato all'interno della risposta restituita riceverà una stringa vuota come input e non genererà l'output previsto.

Filtri Liquid supportati

I filtri Liquid seguenti sono supportati nei set-body criteri. Per esempi di filtro, vedere la documentazione liquida.

Nota

Il criterio richiede l'uso di maiuscole e minuscole Pascal per i nomi di filtro Liquid (ad esempio, "AtLeast" anziché "at_least").

  • Abs
  • Aggiunta
  • AtLeast
  • AtMost
  • Capitalizzare
  • Compact
  • Valuta
  • Data
  • Default
  • DividedBy
  • Minuscolo
  • ESC
  • First
  • H
  • Join.
  • Last
  • Lstrip
  • Mapping
  • Meno
  • Modulo
  • NewlineToBr
  • Più
  • Anteporre
  • Rimuovi
  • RemoveFirst
  • Sostituzione
  • ReplaceFirst
  • Round
  • Rstrip
  • Dimensione
  • Fetta
  • Sort
  • Divisa
  • Striscia
  • StripHtml
  • StripNewlines
  • Times
  • Truncate
  • TruncateWords
  • Uniq
  • Maiuscolo
  • UrlDecode
  • Urlencode

Esempi

Testo letterale

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

Accesso al corpo come stringa

Il corpo della richiesta originale viene preservato in modo che sia possibile accedervi in un secondo momento nella pipeline.

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

Accesso al corpo come JObject

Poiché non si riserva il corpo della richiesta originale, l'accesso verrà generato in un secondo momento nella pipeline.

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

Filtrare la risposta in base al prodotto

Questo esempio mostra come eseguire il filtro del contenuto rimuovendo gli elementi dati dalla risposta ricevuta da un servizio back-end quando si usa il Starter prodotto. La risposta back-end di esempio include proprietà a livello radice simili all'API 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>

Convertire JSON in SOAP usando un modello 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>

Trasformare JSON usando un modello Liquid

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

Accedere al corpo come dati del modulo codificati con URL

Nell'esempio seguente viene usata l'espressione AsFormUrlEncodedContent() per accedere al corpo della richiesta come dati del modulo con codifica URL (tipo di application/x-www-form-urlencodedcontenuto ) e quindi la converte in JSON. Poiché non si riserva il corpo della richiesta originale, l'accesso verrà generato in un secondo momento nella pipeline.

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

Accedere e restituire il corpo come dati del modulo codificati con URL

Nell'esempio seguente viene usata l'espressione AsFormUrlEncodedContent() per accedere al corpo della richiesta come dati del modulo con codifica URL (tipo di application/x-www-form-urlencodedcontenuto ), aggiunge dati al payload e restituisce i dati del modulo con codifica URL. Poiché non si riserva il corpo della richiesta originale, l'accesso verrà generato in un secondo momento nella pipeline.

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

Per ulteriori informazioni sull'utilizzo dei criteri, vedere: