Set body (Imposta corpo)
SI APPLICA A: Tutti i livelli di Gestione API
Usare il criterio set-body
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 con context.Request.Body
o context.Response.Body
, il corpo del messaggio originale viene perso e deve essere impostato riportandolo 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 del criterio. Altre informazioni su come impostare o modificare i criteri di API Management.
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 di modelli in cui verrà eseguito il criterio set-body . Al momento, l'unico valore supportato è:- liquid : i criteri set-body useranno il motore di creazione di modelli Liquid |
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 del criterio 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 data vengono semplicemente copiati.Le espressioni del criterio non sono consentite. |
No | true |
Per accedere alle informazioni sulla richiesta e la risposta, il modello Liquid può essere associato a un oggetto di 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
- Sezioni del criterio: inbound, outbound, back-end
- Ambiti del criterio: globale, area di lavoro, prodotto, API, operazione
- Gateway: classico, v2, consumo, self-hosted, area di lavoro
Note sull'utilizzo
- Se il criterio
set-body
viene usato per restituire un corpo nuovo o aggiornato non è necessario impostarepreserveContent
sutrue
, perché il nuovo contenuto del corpo viene fornito in modo esplicito. - Non ha senso mantenere il contenuto di una risposta nella pipeline in ingresso, poiché non è ancora stata ricevuta 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 vi è alcun corpo del messaggio, ad esempio in un'operazione
GET
in ingresso, viene generata un'eccezione.
Per altre informazioni, vedere le sezioni context.Request.Body
, context.Response.Body
e IMessageBody
nella tabella Variabile di contesto.
Uso di 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. Può essere efficace se si desidera 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:"yyyyMMddTHH: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 Liquid 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 Liquid 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 criteri set-body
. Per esempi di filtro, vedere la documentazione su Liquid.
Nota
Il criterio richiede l'uso di maiuscole e minuscole Pascal per i nomi di filtri Liquid (ad esempio, "AtLeast" anziché "at_least").
- Abs
- Aggiunta
- AtLeast
- AtMost
- Iniziali maiuscole
- Compact
- Valuta
- Data
- Default
- DividedBy
- Downcase
- ESC
- First
- H
- Join.
- Last
- Lstrip
- Mapping
- Meno
- Modulo
- NewlineToBr
- Più
- Anteponi
- Rimuovi
- RemoveFirst
- Sostituzione
- ReplaceFirst
- Round
- Rstrip
- Dimensione
- Fetta
- Ordinamento
- Divisa
- Strip
- StripHtml
- StripNewlines
- Times
- Truncate
- TruncateWords
- Uniq
- Upcase
- UrlDecode
- UrlEncode
Esempi
Testo letterale
<set-body>Hello world!</set-body>
Accedere al corpo come stringa
Il corpo della richiesta originale viene mantenuto per potervi accedere più avanti nella pipeline.
<set-body>
@{
string inBody = context.Request.Body.As<string>(preserveContent: true);
if (inBody[0] =='c') {
inBody[0] = 'm';
}
return inBody;
}
</set-body>
Accedere al corpo come JObject
Poiché il corpo della richiesta originale non viene mantenuto, l'accesso a tale corpo più avanti nella pipeline genererà un'eccezione.
<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 operazioni di filtro sui contenuti rimuovendo elementi di dati dalla risposta ricevuta da un servizio back-end quando si usa il prodotto Starter
. 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 contenuto application/x-www-form-urlencoded
) e quindi la converte in JSON. Poiché il corpo della richiesta originale non viene mantenuto, l'accesso a tale corpo più avanti nella pipeline genererà un'eccezione.
<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 contenuto application/x-www-form-urlencoded
), aggiunge dati al payload e restituisce i dati del modulo con codifica URL. Poiché il corpo della richiesta originale non viene mantenuto, l'accesso a tale corpo più avanti nella pipeline genererà un'eccezione.
<set-body>
@{
var body = context.Request.Body.AsFormUrlEncodedContent();
body["newKey"].Add("newValue");
return body.ToFormUrlEncodedContent();
}
</set-body>
Criteri correlati
Contenuto correlato
Per ulteriori informazioni sull'utilizzo dei criteri, vedere:
- Esercitazione: trasformare e proteggere l'API
- Informazioni di riferimento sui criteri per un elenco completo delle istruzioni dei criteri e delle relative impostazioni
- Espressioni di criteri
- Impostare o modificare criteri
- Riutilizzare le configurazioni dei criteri
- Repository dei frammenti di criteri
- Creare criteri usando Microsoft Copilot in Azure