Definir corpo

APLICA-SE A: Todas as camadas de gerenciamento de API

Use a set-body política para definir o corpo da mensagem para uma solicitação ou resposta. Para acessar o corpo da mensagem, você pode usar a context.Request.Body propriedade ou o context.Response.Body, dependendo se a política está na seção de entrada ou saída.

Importante

Por padrão, quando você acessa o corpo da mensagem usando context.Request.Body ou context.Response.Body, o corpo da mensagem original é perdido e deve ser definido retornando o corpo de volta na expressão. Para preservar o conteúdo do corpo, defina o preserveContent parâmetro como true ao acessar a mensagem. Se preserveContent estiver definido como true e um corpo diferente for retornado pela expressão, o corpo retornado será usado.

Nota

Defina os elementos da política e os elementos filho na ordem fornecida na declaração de política. Saiba mais sobre como definir ou editar políticas de Gerenciamento de API.

Declaração de política

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

Atributos

Atributo Description Necessário Predefinição
aninhado Usado para alterar o modo de modelagem no qual a set-body política é executada. Atualmente, o único valor suportado é:

- liquid - a set-body política utilizará o motor de modelos líquidos
No N/A
XSI-NIL Usado para controlar como os elementos marcados com xsi:nil="true" são representados em cargas úteis XML. Defina como um dos seguintes valores:

- blank - nil é representado com uma cadeia de caracteres vazia.
- null - nil é representado com um valor nulo.

Expressões de política não são permitidas.
Não blank
data de análise Booleano. Especifica se as cadeias de caracteres formatadas em data (por exemplo, "/Date(1198908717056)/""2012-03-21T05:40Z", ) são analisadas como System.DateTime (mm/dd/yyyy hh:mm:ss). Quando definido como false, os valores de data são simplesmente copiados.

Expressões de política não são permitidas.
Não true

Para acessar informações sobre a solicitação e a resposta, o modelo Liquid pode ser vinculado a um objeto de contexto com as seguintes propriedades:

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

Utilização

Notas de utilização

  • Se você estiver usando a set-body política para retornar um corpo novo ou atualizado, não precisará definir preserveContent como true porque está fornecendo explicitamente o novo conteúdo do corpo.
  • Preservar o conteúdo de uma resposta no pipeline de entrada não faz sentido porque ainda não há resposta.
  • Preservar o conteúdo de uma solicitação no pipeline de saída não faz sentido porque a solicitação já foi enviada para o back-end neste momento.
  • Se essa política for usada quando não houver corpo de mensagem, por exemplo, em uma entrada GET, uma exceção será lançada.

Para obter mais informações, consulte o context.Request.Body, context.Response.Bodye as seções na tabela Variável de IMessageBodycontexto.

Usando modelos Liquid com set-body

A set-body política pode ser configurada para usar a linguagem de modelos Liquid para transformar o corpo de uma solicitação ou resposta. Isso pode ser eficaz se você precisar remodelar completamente o formato da sua mensagem.

Importante

A implementação do Liquid usada na set-body política é configurada no 'modo C#'. Isto é particularmente importante quando se fazem coisas como filtrar. Por exemplo, o uso de um filtro de data requer o uso de caixa Pascal e formatação de data em C#, por exemplo:

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

Importante

Para vincular corretamente a um corpo XML usando o modelo Liquid, use uma set-header política para definir Content-Type como application/xml, text/xml (ou qualquer tipo que termine com +xml); para um corpo JSON, ele deve ser application/json, text/json (ou qualquer tipo que termine com +json).

Importante

Os modelos líquidos usam o corpo de solicitação/resposta no pipeline de execução atual como entrada. Por esse motivo, os modelos líquidos não funcionam quando usados dentro de uma política de retorno-resposta. Uma política de retorno-resposta cancela o pipeline de execução atual e remove o corpo da solicitação/resposta. Como resultado, qualquer modelo líquido usado dentro do retorno-resposta receberá uma string vazia como sua entrada e não produzirá a saída esperada.

Filtros de líquidos suportados

Os seguintes filtros de líquido são suportados set-body na política. Para obter exemplos de filtros, consulte a documentação de Líquidos.

Nota

A política requer invólucro Pascal para nomes de filtros líquidos (por exemplo, "AtLeast" em vez de "at_least").

  • Abs
  • Acrescentar
  • AtLeast
  • No máximo
  • Capitalizar
  • Compactar
  • Moeda
  • Date
  • Predefinido
  • Divididopor:
  • Caixa baixa
  • Esc
  • First
  • H
  • Participar
  • Last
  • Lstrip
  • Mapa
  • Menos
  • Módulo
  • NewlineToBr
  • Sinal de adição
  • Pendente
  • Remover
  • RemoveFirst
  • Replace
  • SubstituirPrimeiro
  • Round
  • Rstrip
  • Tamanho
  • Setor
  • Ordenar
  • Dividida
  • Tira
  • StripHtml
  • StripNewlines
  • Times
  • Truncar
  • TruncateWords
  • Uniq
  • Caixa de reposição
  • UrlDecode
  • UrlEncode

Exemplos

Texto literal

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

Acessando o corpo como uma cadeia de caracteres

Estamos preservando o corpo de solicitação original para que possamos acessá-lo mais tarde no pipeline.

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

Acessando o corpo como um JObject

Como não estamos reservando o corpo de solicitação original, acessá-lo mais tarde no pipeline resultará em uma exceção.

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

Filtrar a resposta com base no produto

Este exemplo mostra como executar a filtragem de conteúdo removendo elementos de dados da resposta recebida de um serviço de back-end ao usar o Starter produto. O exemplo de resposta de back-end inclui propriedades de nível raiz semelhantes à API de chamada do 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>

Converter JSON em SOAP usando um modelo 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>

Transformar JSON usando um modelo Liquid

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

Acessar o corpo como dados de formulário codificados por URL

O exemplo a seguir usa a AsFormUrlEncodedContent() expressão para acessar o corpo da solicitação como dados de formulário codificados por URL (tipo application/x-www-form-urlencodedde conteúdo) e, em seguida, converte-a em JSON. Como não estamos reservando o corpo de solicitação original, acessá-lo mais tarde no pipeline resultará em uma exceção.

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

Acessar e retornar o corpo como dados de formulário codificados por URL

O exemplo a seguir usa a AsFormUrlEncodedContent() expressão para acessar o corpo da solicitação como dados de formulário codificados por URL (tipo application/x-www-form-urlencodedde conteúdo), adiciona dados à carga útil e retorna dados de formulário codificados por URL. Como não estamos reservando o corpo de solicitação original, acessá-lo mais tarde no pipeline resultará em uma exceção.

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

Para obter mais informações sobre como trabalhar com políticas, consulte: