Definir corpo

APLICA-SE A: todas as camadas do Gerenciamento de API

Utilize a política set-body para definir o corpo da mensagem para uma solicitação ou resposta. Para acessar o corpo da mensagem, você pode usar a propriedade context.Request.Body ou a context.Response.Body, dependendo da seção em que a política está: de entrada ou de 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 por meio do retorno do corpo de volta na expressão. Para preservar o conteúdo do corpo, defina o parâmetro preserveContent para true ao acessar a mensagem. Se preserveContent é definido para true e um corpo diferente é retornado pela expressão, o corpo retornado é usado.

Observação

Defina os elementos da política e os elementos filho na ordem fornecida na declaração da política. Saiba mais sobre como definir e editar as 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 Descrição Obrigatório Padrão
template Usado para alterar o modo de modelagem no qual a política set-body será executada. Atualmente, o único valor aceito é:

- liquid – a política set-body usará o mecanismo de modelagem líquida
Não N/D
xsi-nil Usado para controlar como os elementos marcados com xsi:nil="true" são representados em conteúdo XML. Defina um dos valores a seguir:

- 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
parse-date Booliano. Especifica se as cadeias de caracteres formatadas por data (por exemplo, "/Date(1198908717056)/") "2012-03-21T05:40Z"são analisadas para 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 Líquido pode ser associado 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

Uso

Observações de uso

  • Se você estiver usando a política set-body para retornar um corpo novo ou atualizado, você não precisará definir preserveContent para true porque você estará 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á nenhuma resposta.
  • Preservar o conteúdo de uma solicitação no pipeline de saída não faz sentido porque nesse momento a solicitação já foi enviada para o back-end.
  • Se essa política é usada quando não há nenhum corpo da mensagem, por exemplo em um GET de entrada, uma exceção é lançada.

Para obter mais informações, consulte as seções context.Request.Body, context.Response.Body e IMessageBody na tabela context.Request.Body.

Usando modelos Líquidos com o corpo definido

A política set-body pode ser configurada para usar a linguagem de modelagem set-body para transformar o corpo de uma solicitação ou resposta. Isso poderá ser eficaz se você precisar remodelar por completo o formato da mensagem.

Importante

A implementação de Líquido usado na política set-body é configurada no “modo C#”. Isso é particularmente importante ao executar ações como filtragem. Por exemplo, o uso de um filtro de data exige o uso de maiúsculas Pascal e da formatação das datas do C#, por exemplo:

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

Importante

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

Importante

Os modelos Liquid usam o corpo da solicitação/resposta no pipeline de execução atual como entrada. Por esse motivo, os modelos Liquid 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 Liquid usado dentro da resposta de retorno receberá uma cadeia de caracteres vazia como entrada e não produzirá a saída esperada.

Filtros do Liquid com suporte

Os filtros do Liquid a seguir têm suporte na política set-body. Para obter exemplos de filtro, confira a Documentação do Liquid.

Observação

A política requer o uso de maiúsculas e minúsculas Pascal para os nomes de filtro do Liquid (por exemplo, "AtLeast" em vez de "at_least").

  • Abs
  • Acrescentar
  • AtLeast
  • AtMost
  • Capitalize
  • Compacto
  • Moeda
  • Data
  • Padrão
  • DividedBy
  • Downcase
  • Escape
  • Primeiro
  • H
  • Join
  • Último
  • Lstrip
  • Mapeamento
  • Minus
  • Módulo
  • NewlineToBr
  • Plus
  • Prepend
  • Remover
  • RemoveFirst
  • Substitua
  • ReplaceFirst
  • Round
  • Rstrip
  • Tamanho
  • Fatia
  • Classificar
  • Divisão
  • Strip
  • StripHtml
  • StripNewlines
  • Horas
  • Truncate
  • TruncateWords
  • Uniq
  • Upcase
  • UrlDecode
  • UrlEncode

Exemplos

Texto literal

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

Acessar o corpo como uma cadeia de caracteres

Estamos preservando o corpo da solicitação original, de modo 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>

Acessar o corpo como um JObject

Como não estamos preservando o corpo da 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>

Resposta de filtro 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 produto Starter. A resposta de back-end de exemplo inclui propriedades de nível de raiz semelhantes à API de chamada 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 Líquido

<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 Líquido

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

O exemplo a seguir usa a expressão AsFormUrlEncodedContent() para acessar o corpo da solicitação como dados de formulário codificados em URL (tipo de conteúdo application/x-www-form-urlencoded) e, em seguida, o converte em JSON. Como não estamos preservando o corpo da 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 em URL

O exemplo a seguir usa a AsFormUrlEncodedContent() expressão para acessar o corpo da solicitação como dados de formulário codificados em URL (tipo de conteúdo application/x-www-form-urlencoded), adiciona dados ao conteúdo e retorna dados de formulário codificados em URL. Como não estamos preservando o corpo da 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: