YARP Docsv2.3
Documentação/Roteamento/Roteamento por parâmetro de consulta

Roteamento por parâmetro de consulta

As rotas de proxy especificadas na configuração ou via código devem incluir pelo menos um caminho ou host para corresponder

Roteamento baseado em parâmetro de consulta do YARP

As rotas de proxy especificadas na configuração ou via código devem incluir pelo menos um caminho ou host para corresponder. Além disso, uma rota também pode especificar um ou mais parâmetros de consulta que devem estar presentes na requisição.

Precedência

A ordem de precedência padrão de correspondência de rotas é 1) caminho, 2) método, 3) host, 4) cabeçalhos, 5) parâmetros de consulta. Isso significa que uma rota que especifica métodos e nenhum parâmetro de consulta terá correspondência antes de uma rota que especifica parâmetros de consulta e nenhum método. Isso pode ser sobrescrito definindo a propriedade Order em uma rota.

Configuração

Os parâmetros de consulta são especificados na seção Match de uma rota de proxy.

Se várias regras de parâmetro de consulta forem especificadas em uma rota, todas devem corresponder para que a rota seja escolhida. A lógica OR deve ser implementada dentro de uma regra de parâmetro de consulta ou como rotas separadas.

Configuração:

JSON"Routes": {
   "route1" : {
      "ClusterId": "cluster1",
      "Match": {
         "Path": "{**catch-all}",
         "QueryParameters": [
             {
                "Name": "queryparam1",
                "Values": [ "value1" ],
                "Mode": "Exact"
             }
         ]
      }
   },
   "route2" : {
      "ClusterId": "cluster1",
      "Match": {
         "Path": "{**catch-all}",
         "QueryParameters": [
             {
                          "Name": "queryparam2",
                          "Values": [ "1prefix", "2prefix" ],
                          "Mode": "Prefix"
                      }
                   ]
}
},
"route3" : {
"ClusterId": "cluster1",
"Match": {
                   "Path": "{**catch-all}",
                   "QueryParameters": [
                      {
                          "Name": "queryparam3",
                          "Mode": "Exists"
                      }
                   ]
}
},
"route4" : {
"ClusterId": "cluster1",
"Match": {
                   "Path": "{**catch-all}",
                   "QueryParameters": [
                      {
                          "Name": "queryparam4",
                          "Values": [ "value1", "value2" ],
                          "Mode": "Exact"
                      },
                      {
                          "Name": "queryparam5",
                          "Mode": "Exists"
                      }
                   ]
}
},
"route5" : {
"ClusterId": "cluster1",
"Match": {
                   "Path": "{**catch-all}",
                   "QueryParameters": [
                      {
                          "Name": "queryparam5",
                          "Values": [ "value1", "value2" ],
                          "Mode": "Contains"
                      },
                      {
                          "Name": "queryparam6",
                          "Mode": "Exists"
                      }
                   ]
}
},
"route6" : {
"ClusterId": "cluster1",
       "Match": {
                   "Path": "{**catch-all}",
                   "QueryParameters": [
                      {
                          "Name": "queryparam6",
                          "Values": [ "value1", "value2" ],
                          "Mode": "NotContains"
                      },
                      {
                          "Name": "queryparam7",
                          "Mode": "Exists"
                      }
                   ]
       }
    }
}
Code:
C#var routes = new[]
{
      new RouteConfig()
      {
             RouteId = "route1",
             ClusterId = "cluster1",
             Match = new RouteMatch
             {
                   Path = "{**catch-all}",
                   QueryParameters = new[]
                   {
                          new RouteQueryParameter()
                          {
                                 Name = "QueryParam1",
                                 Values = new[] { "value1" },
                                 Mode = QueryParameterMatchMode.Exact
                          }
                   }
             }
      },
      new RouteConfig()
      {
             RouteId = "route2",
             ClusterId = "cluster1",
             Match = new RouteMatch
             {
                   Path = "{**catch-all}",
                   QueryParameters = new[]
                   {
                          new RouteQueryParameter()
                          {
                                 Name = "QueryParam2",
                             Values = new[] { "1prefix", "2prefix" },
                             Mode = QueryParameterMatchMode.Prefix
                         }
                      }
                   }
},
new RouteConfig()
{
                   RouteId = "route3",
                   ClusterId = "cluster1",
                   Match = new RouteMatch
                   {
                      Path = "{**catch-all}",
                      QueryParameters = new[]
                      {
                         new RouteQueryParameter()
                         {
                             Name = "QueryParam3",
                             Mode = QueryParameterMatchMode.Exists
                         }
                      }
                   }
},
new RouteConfig()
{
                   RouteId = "route4",
                   ClusterId = "cluster1",
                   Match = new RouteMatch
                   {
                      Path = "{**catch-all}",
                      QueryParameters = new[]
                      {
                      new RouteQueryParameter()
                         {
                             Name = "QueryParam4",
                             Values = new[] { "value1", "value2" },
                             Mode = QueryParameterMatchMode.Exact
                         },
                         new RouteQueryParameter()
                         {
                             Name = "QueryParam5",
                             Mode = QueryParameterMatchMode.Exists
                         }
                      }
                   }
},
new RouteConfig()
{
                   RouteId = "route5",
                   ClusterId = "cluster1",
                   Match = new RouteMatch
                   {
                      Path = "{**catch-all}",
                      QueryParameters = new[]
                      {
                         new RouteQueryParameter()
                         {
                            Name = "QueryParam5",
                            Values = new[] { "value1", "value2" },
                            Mode = QueryParameterMatchMode.Contains
                         }
                      }
                   }
    },
    new RouteConfig()
    {
                   RouteId = "route6",
                   ClusterId = "cluster1",
                   Match = new RouteMatch
                   {
                      Path = "{**catch-all}",
                      QueryParameters = new[]
                      {
                         new RouteQueryParameter()
                         {
                            Name = "QueryParam6",
                            Values = new[] { "value1", "value2" },
                            Mode = QueryParameterMatchMode.NotContains
                         }
                      }
                   }
    }
};

Contrato

RouteQueryParameter define o contrato de código e é mapeado a partir da configuração.

Name

O nome do parâmetro de consulta a ser verificado na requisição. Um valor não vazio é obrigatório. Este campo não diferencia maiúsculas de minúsculas.

Values

Uma lista de valores possíveis a serem procurados. O parâmetro de consulta deve corresponder a pelo menos um desses valores de acordo com o Mode especificado, exceto para o 'NotContains'. Pelo menos um valor é obrigatório, a menos que o Mode esteja definido como Exists .

Mode

QueryParameterMatchMode especifica como corresponder o(s) valor(es) ao parâmetro de consulta

da requisição. O padrão é Exact .

Exact - O parâmetro de consulta deve corresponder por completo, conforme o valor de IsCaseSensitive . Apenas parâmetros de consulta únicos são suportados. Se houver múltiplos parâmetros de consulta com o mesmo nome, a correspondência falha. Prefix - O parâmetro de consulta deve corresponder por prefixo, conforme o valor de IsCaseSensitive . Apenas parâmetros de consulta únicos são suportados. Se houver múltiplos parâmetros de consulta com o mesmo nome, a correspondência falha. Exists - O parâmetro de consulta deve existir e conter qualquer valor não vazio. Contains - O parâmetro de consulta deve conter o valor para haver correspondência, conforme o valor de IsCaseSensitive . Apenas parâmetros de consulta únicos são suportados. Se houver múltiplos parâmetros de consulta com o mesmo nome, a correspondência falha. NotContains - O parâmetro de consulta não deve conter nenhum dos valores de correspondência, conforme o valor de IsCaseSensitive . Apenas parâmetros de consulta únicos são suportados. Se houver múltiplos parâmetros de consulta com o mesmo nome, a correspondência falha.

IsCaseSensitive

Indica se a correspondência de valor deve ser feita diferenciando maiúsculas de minúsculas ou não. O padrão é false , ou seja, não diferencia.

Encoding

A cadeia de consulta da requisição será analisada e decodificada antes da correspondência com as regras de rota.

"route8" : { "ClusterId": "cluster1", "Match": { "Path": "{**catch-all}", "QueryParameters": [ { "Name": "queryparam8", "Values": [ "another value" ], "Mode": "Exact" } ] }

Corresponde a

?queryparam8=another%20value

ou

?queryparam8=another+value

Exemplos

Estes exemplos usam a configuração especificada acima.

Cenário 1 - Correspondência exata de parâmetro de consulta

Uma requisição com o seguinte parâmetro de consulta corresponderá à route1.

?QueryParam1=Value1

Múltiplos parâmetros de consulta com o mesmo nome não são suportados atualmente e não corresponderão.

?QueryParam1=Value1&QueryParam1=Value2

Cenário 2 - Múltiplos valores

A route2 definiu múltiplos valores para procurar em um parâmetro de consulta ("1prefix", "2prefix"), qualquer um dos valores é aceitável. Ela também especificou o Mode como Prefix , então qualquer parâmetro de consulta que comece com esses valores é aceitável. Qualquer um dos seguintes parâmetros de consulta corresponderá à route2.

?QueryParam2=1prefix

?QueryParam2=2prefix

?QueryParam2=1prefix-extra

?QueryParam2=2prefix-extra

Múltiplos parâmetros de consulta com o mesmo nome não são suportados atualmente e não corresponderão.

?QueryParam2=2prefix&QueryParam2=1prefix

Cenário 3 - Exists

A route3 exige apenas que o parâmetro de consulta "QueryParam3" exista com qualquer valor não vazio. O exemplo a seguir corresponderá à route3.

?QueryParam3=value

Um parâmetro de consulta vazio não corresponderá.

?QueryParam3 ?QueryParam3=

Este modo suporta parâmetros de consulta com múltiplos valores e múltiplos parâmetros de consulta com o mesmo nome, já que não observa o conteúdo do parâmetro de consulta. Os seguintes corresponderão.

?QueryParam3=value1&QueryParam3=value2

Cenário 4 - Múltiplos parâmetros de consulta

A route4 exige tanto QueryParam4 quanto QueryParam5 , cada um correspondendo de acordo com seu Mode especificado. Os seguintes parâmetros de consulta corresponderão à route4:

?QueryParam4=value1&QueryParam5=AnyValue

?QueryParam4=value2&QueryParam5=AnyValue

Estes não corresponderão à route4 porque falta um dos parâmetros de consulta exigidos:

?QueryParam4=value2

?QueryParam5=AnyValue Nota: o autor criou este artigo com o auxílio de IA. Saiba mais

Adaptado do Microsoft Learn , licenciado sob CC BY 4.0 .