YARP Docsv2.3
Dokumentation/Routing/Routing über Abfrageparameter

Routing über Abfrageparameter

Proxyrouten, die in der Konfiguration oder über Code angegeben werden, müssen mindestens einen Pfad oder Host enthalten, gegen den abgeglichen

Abfrageparameterbasiertes Routing in YARP

Proxyrouten, die in der Konfiguration oder über Code angegeben werden, müssen mindestens einen Pfad oder Host enthalten, gegen den abgeglichen wird. Zusätzlich dazu kann eine Route auch einen oder mehrere Abfrageparameter angeben, die in der Anforderung vorhanden sein müssen.

Rangfolge

Die Standardreihenfolge für die Routenübereinstimmung lautet 1) Pfad, 2) Methode, 3) Host, 4) Header, 5) Abfrageparameter. Das bedeutet, dass eine Route, die Methoden, aber keine Abfrageparameter angibt, vor einer Route übereinstimmt, die Abfrageparameter, aber keine Methoden angibt. Dies kann überschrieben werden, indem die Order-Eigenschaft einer Route festgelegt wird.

Konfiguration

Abfrageparameter werden im Abschnitt „Match“ einer Proxyroute angegeben.

Wenn für eine Route mehrere Abfrageparameterregeln angegeben werden, müssen alle übereinstimmen, damit die Route verwendet wird. Eine ODER-Logik muss entweder innerhalb einer Abfrageparameterregel oder durch separate Routen umgesetzt werden.

Konfiguration:

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
                         }
                      }
                   }
    }
};

Vertrag

RouteQueryParameter definiert den Code-Vertrag und wird aus der Konfiguration zugeordnet.

Name

Der Name des Abfrageparameters, nach dem in der Anforderung gesucht wird. Ein nicht leerer Wert ist erforderlich. Dieses Feld unterscheidet nicht zwischen Groß- und Kleinschreibung.

Values

Eine Liste möglicher Werte, nach denen gesucht wird. Der Abfrageparameter muss mindestens einem dieser Werte gemäß dem angegebenen Mode entsprechen – mit Ausnahme von „NotContains“. Mindestens ein Wert ist erforderlich, sofern Mode nicht auf Exists gesetzt ist.

Mode

QueryParameterMatchMode gibt an, wie der Wert bzw. die Werte mit dem Abfrageparameter der Anforderung

abgeglichen werden. Der Standardwert ist Exact .

Exact - Der Abfrageparameter muss vollständig übereinstimmen, abhängig vom Wert von IsCaseSensitive . Es werden nur einzelne Abfrageparameter unterstützt. Sind mehrere Abfrageparameter mit demselben Namen vorhanden, schlägt der Abgleich fehl. Prefix - Der Abfrageparameter muss anhand eines Präfixes übereinstimmen, abhängig vom Wert von IsCaseSensitive . Es werden nur einzelne Abfrageparameter unterstützt. Sind mehrere Abfrageparameter mit demselben Namen vorhanden, schlägt der Abgleich fehl. Exists - Der Abfrageparameter muss vorhanden sein und einen beliebigen nicht leeren Wert enthalten. Contains - Der Abfrageparameter muss den Wert für eine Übereinstimmung enthalten, abhängig vom Wert von IsCaseSensitive . Es werden nur einzelne Abfrageparameter unterstützt. Sind mehrere Abfrageparameter mit demselben Namen vorhanden, schlägt der Abgleich fehl. NotContains - Der Abfrageparameter darf keinen der Abgleichswerte enthalten, abhängig vom Wert von IsCaseSensitive . Es werden nur einzelne Abfrageparameter unterstützt. Sind mehrere Abfrageparameter mit demselben Namen vorhanden, schlägt der Abgleich fehl.

IsCaseSensitive

Gibt an, ob der Wertabgleich unter Berücksichtigung oder ohne Berücksichtigung der Groß-/Kleinschreibung erfolgen soll. Der Standardwert ist false , also ohne Berücksichtigung der Groß-/Kleinschreibung.

Codierung

Die Abfragezeichenfolge der Anforderung wird geparst und decodiert, bevor sie mit den Routenregeln abgeglichen wird.

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

Übereinstimmung mit

?queryparam8=another%20value

oder

?queryparam8=another+value

Beispiele

Diese Beispiele verwenden die oben angegebene Konfiguration.

Szenario 1 – Exakte Abfrageparameterübereinstimmung

Eine Anforderung mit dem folgenden Abfrageparameter stimmt mit route1 überein.

?QueryParam1=Value1

Mehrere Abfrageparameter mit demselben Namen werden derzeit nicht unterstützt und führen zu keiner Übereinstimmung.

?QueryParam1=Value1&QueryParam1=Value2

Szenario 2 – Mehrere Werte

Route2 definiert mehrere Werte, nach denen in einem Abfrageparameter gesucht wird („1prefix“, „2prefix“) – jeder der Werte ist zulässig. Zudem wurde Mode als Prefix angegeben, sodass jeder Abfrageparameter zulässig ist, der mit diesen Werten beginnt. Jeder der folgenden Abfrageparameter stimmt mit route2 überein.

?QueryParam2=1prefix

?QueryParam2=2prefix

?QueryParam2=1prefix-extra

?QueryParam2=2prefix-extra

Mehrere Abfrageparameter mit demselben Namen werden derzeit nicht unterstützt und führen zu keiner Übereinstimmung.

?QueryParam2=2prefix&QueryParam2=1prefix

Szenario 3 – Exists

Route3 erfordert lediglich, dass der Abfrageparameter „QueryParam3“ vorhanden ist und einen beliebigen nicht leeren Wert enthält. Das folgende Beispiel stimmt mit route3 überein.

?QueryParam3=value

Ein leerer Abfrageparameter führt zu keiner Übereinstimmung.

?QueryParam3 ?QueryParam3=

Dieser Modus unterstützt Abfrageparameter mit mehreren Werten sowie mehrere Abfrageparameter mit demselben Namen, da der Inhalt des Abfrageparameters nicht berücksichtigt wird. Das Folgende stimmt überein.

?QueryParam3=value1&QueryParam3=value2

Szenario 4 – Mehrere Abfrageparameter

Route4 erfordert sowohl QueryParam4 als auch QueryParam5 , wobei jeder gemäß dem für ihn angegebenen Mode übereinstimmen muss. Die folgenden Abfrageparameter stimmen mit route4 überein:

?QueryParam4=value1&QueryParam5=AnyValue

?QueryParam4=value2&QueryParam5=AnyValue

Diese stimmen nicht mit route4 überein, da einer der erforderlichen Abfrageparameter fehlt:

?QueryParam4=value2

?QueryParam5=AnyValue Hinweis: Dieser Artikel wurde mit Unterstützung von KI erstellt. Weitere Informationen

Angepasst von Microsoft Learn , lizenziert unter CC BY 4.0 .